首页
学习
活动
专区
圈层
工具
发布

深度解析Linux中的编译器gccg++

gcc code.o -o mycode的可执行文件 这个操作我们叫做链接了 一点开始链接了,那么就形成了一个mycode的文件 我们使用ldd mycode来进行查看我们是否存在这个链接成功了 那么我们根据这个链接找到的就是这个...,那么我们所有的可执行文件都运行不了了 静态链接的优点:一但编译好不依赖任何库,浪费磁盘和内存空间 在 Linux 系统中,gcc 和 g++ 是 GNU 编译器集合中的核心工具,分别用于编译 C 和...三、动静态库的选择 对比项 静态库 动态库 文件大小 可执行文件较大,库内容嵌入其中 可执行文件较小,运行时需要库文件支持 运行效率 加载速度更快,无需查找库文件 运行时加载,可能略慢 共享能力 不支持共享...,每个程序都包含独立的副本 支持共享,多个程序可以使用同一个库 版本控制 更新库需要重新编译程序 更新库无需重新编译,但需注意兼容性 四、GCC/G++ 动静态库的链接细节 1....检查动态库是否导出特定符号: objdump -T libmylib.so | grep symbol_name 添加动态库路径到系统默认: 将动态库路径添加到 /etc/ld.so.conf,然后运行

35210

Linux 程序编译过程详解

(Linking) GCC 工具链介绍 通常所说的GCC是GUN Compiler Collection的简称,是Linux系统上常用的编译工具。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。 如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。...与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。 准备工作 由于GCC工具链主要是在Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。...data bss dec hex filename 1183 552 8 1743 6cf hello $ ldd hello //可以看出该可执行文件链接了很多其他动态库

2.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 程序编译过程的来龙去脉

    GCC 工具链介绍 通常所说的GCC是GUN Compiler Collection的简称,是Linux系统上常用的编译工具。GCC工具链软件包括GCC、Binutils、C运行库等。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。 如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。...与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。 准备工作 由于GCC工具链主要是在Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。...data bss dec hex filename 1183 552 8 1743 6cf hello $ ldd hello //可以看出该可执行文件链接了很多其他动态库

    3.3K30

    Linux 程序编译过程详解

    )GCC 工具链介绍通常所说的GCC是GUN Compiler Collection的简称,是Linux系统上常用的编译工具。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。...与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。准备工作由于GCC工具链主要是在Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。...在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。...data bss dec hex filename 1183 552 8 1743 6cf hello$ ldd hello //可以看出该可执行文件链接了很多其他动态库

    2.3K30

    CC++生态工具链——gccg++编译器使用指南

    三,常见代码文件后缀名 (1)目标文件: xxx.o, 操作系统:Linux, Mac xxx.obj, 操作系统:windows (2)二进制文件: xxx(没有后缀名), 操作系统:Linux,...Mac, FreeBSD, xxx.exe, 操作系统:windows xxx.hex,操作系统:嵌入式系统 (3)共享库文件,也叫动态库文件: xxx.dll, 操作系统:windows xxx.so..., 操作系统:Linux xxx.dylib, 操作系统:Mac (4)静态库文件 xxx.a 四,C/C++语言的编译过程 1.预处理 预处理命令声明了编译时需要的各种头文件和宏,比如包含哪些头文件、...目标程序与静态库链接时,目标程序代码调用的任何外部函数的代码都会从静态库中复制到最终的可执行文件中。...在可执行文件开始运行之前,动态库的代码被操作系统复制到内存中进行共享。 动态库之所以叫共享库,可能是由于动态库的代码副本可以在多个程序之间共享。

    3.2K30

    分享一份实战linux面试题目!

    今天给大家分享网友面试的实战linux面试题目,自己可以把它看成自己的面试,如果是你在面对面试官,是否能够说出这些题目的理解和答案: 一、linux驱动: 1、SD卡的协议、SD驱动开发了解多少。...为什么不可以 20、可不可以更改虚函数表的内容 21、你了解过CVTE吗 22、串行通信的协议有哪些 23、对加班的看法 24、编程:输出一个字符串中连续出现次数最多的字符,输出的是最后一个 1、从文件到可执行文件的过程...2、struct结构体与class 3、c语言中struct实现类,怎么实现结构体中有函数 4、进程空间模型 5、一个linux API怎么调用的底层 6、设计模式 7、C++中类的成员函数与类的静态成员函数存储在代码段还是数据段还是哪里...9、C++初始化列表与在括号中初始化有什么区别 10、什么情况下必须在初始化列表中进行初始化 11、多态的基本原理 12、为什么析构函数要为虚函数(请深层次剖析,说底层的原因) 13、多个线程之间有什么是共享的...34、你怎么编译的linux kernel 35、了解container_of吗? 36、线程同步有哪些方式 37、说说自旋锁 38、c与c++有什么区别。

    73230

    Linux库详解

    Windows和Linux系统的本质不同,所以这两个系统库的格式不同,同样也是不兼容的,本文不讲Windows下的库,我们只关注Linux下的程序库 例如我们常用的标准C/C++库、Qt库、GTK库等...可以理解为动态加载库是共享库的另一种调用方式。DL对于实现程序模块化很有用处,因为它可以让程序在运行时进行模块升级。...动态加载库如何实现 在Linux系统中,实现动态加载库的调用,有一个用于打开库、查找符号、处理错误和关闭库的API。...有了动态库,程序的升级会相对比较简单,只需要替换动态库的文件,而不需要替换可执行文件 动态加载库 动态库的文件格式跟共享库没有区别,主要区别在于共享库是程序启动时加载,而动态加载库是运行的过程中加载。...可以理解为动态加载库是共享库的另一种调用方式 4.

    2.4K40

    【Linux系统编程】Linux下的编译器——gccg++的使用 及 动态库和静态库的认识

    其实其中一个比较重要的原因就是Linux提供了这些语言所需要的开发库,如标准C库(libc)、标准C++库(libstdc++)以及其他各种系统库和第三方库。...比如,对于我们上面生成的可执行程序,我们就可以使用ldd命令查看一下它都依赖了哪些库 我们看到这里打印出来有3条,不过我们重点关心一下第二个。...这意味着多个程序可以共享同一个动态库,减少了存储空间的占用。 在编程中,动态库是在运行时由操作系统加载的库文件,程序在运行时需要由链接器引入动态库,才能使用其中的函数或资源。...总结起来: 静态库将库的代码复制到可执行文件中,使得程序独立运行;动态库则共享在操作系统中,减少了内存占用和可执行文件的大小。静态库适合小型独立程序,而动态库适合大型程序或多个程序共享使用。...然后就可以进行静态链接了 对应的命令是 gcc -static:静态链接 ,大家看到了吗,静态链接生成的可执行文件比动态链接生成的大了好多好多。

    3.8K10

    万万没想到,一个可执行文件原来包含了这么多信息!

    拿到一个编译好的可执行文件,你能获取到哪些信息?文件大小,修改时间?文件类型?除此之外呢?实际上它包含了很多信息,这些你都知道吗?...找一个该平台上的正运行的可执行文件或系统库,然后使用readelf -h看一下,是不是很快就看出来了?多么明显的little endian。 关于大小端,更多内容可参考《谈谈字节序的问题》。...同样的,当你在交叉编译的时候,发现总有一个库链接不上,但是库又存在,不妨看看这个库和你要编译的平台是否匹配。 链接了哪些动态库? 编好的程序依赖了哪些动态库呢?可不要放到另外一个平台就起不来啊。....6 (0x00007f749920a000) /lib64/ld-linux-x86-64.so.2 (0x00007f74995d4000) 原来链接了这些库,所以当你在网上下载一些程序,运行的时候提示你某些...可以搜索一下: $ strings main |grep hello hello, 嗯?这样一想,好像还可以把版本号信息写进去呢。 C还是C++?

    82120

    披着CLion的外衣实则在讲CMake

    官网:https://visualstudio.microsoft.com/zh-hans/vs/ 其实对于我们 C++ 程序员而言,最需要的就是一个 Linux 环境,因为很多底层的系统调用是不在 C...++ 标准之内的,C++ 想要做到跨平台很难,所以我们需要把开发环境切换到 Linux 系统,正好 windows 提供了 Linux 子系统,也就是 wsl,完美的解决了这个问题。.../p/145801160 CMake 配置项 如上图所示,第二个 CMake 选项就是我们现在要讲的,而这两个正好也是整个开发环境中最重要的东西,第一个编译工具链决定了 CLion 中已经识别了本机有哪些编译环境...:指定链接可执行文件时使用的链接选项 CMAKE_SYSTEM_NAME :指定当前操作系统名称(如 Windows、Linux 等) CMAKE_SYSTEM_PROCESSOR :指定当前处理器的类型...,且恰好同一个 cmake 项目中产生的库文件是可以直接通过名称链接的,无论链接对象是在子目录还是父目录 target_link_libraries:用于将可执行文件或库文件链接到库文件或可执行文件。

    6.3K31

    含大量图文解析及例程 | Linux下的ELF文件、链接、加载与库(下)

    ,和操作系统联系的非常紧密,我们可以把运行库理解成我们的C语言(包括c++)程序和操作系统之间的抽象层,使得大部分时候我们写的程序不用直接和操作系统的API和系统调用直接打交道,运行库把不同的操作系统API...+语言特性的是gcc编译器,所以gcc提供了两个目标文件crtbeginT.o和crtend.o来实现C++的全局构造和析构 – 实际上以上两个高亮出来的函数就是gcc提供的,有兴趣的读者可以自己翻阅gcc...,简单来说:可执行文件中有main函数,动态库中没有main函数,可执行文件可以被程序执行,动态库需要依赖程序调用者。...共享库和静态库的区别:在链接libc共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真的做链接,可执行文件调用的libc库函数仍然是未定义符号,要在运行时做动态链接。...共享库链接后,指令仍是相对地址,共享库各段的加载地址并没有定死,可以加载到任意位置。

    1.7K23

    使用Zig在arm64上引导Uber的基础设施

    在进行原生编译时,主机和目标是相同的平台(即操作系统、处理器架构和共享库是相同的)。...例如,一块智能手表可以运行已编译的代码,但不能运行编译器,因此我们可以使用交叉编译器为手表编译程序。 sysroot 是目标平台文件系统的归档。例如,特定于目标平台的头文件、共享库、静态库。...示例:使用 GCC 和 Clang 进行交叉编译 让我们在 x86_64 Linux 主机上编译一个 C 文件,目标平台是 Linux aarch64: GCC 调用目标平台特定的可执行文件(aarch64...基于 LLVM 的 C/C++ 工具链 “clang”使用哪些文件来构建最终的可执行文件?...自 2023 年 1 月起,Zig 工具链可以将 Uber Go 代码库中的所有 C 和 C++ 代码编译到 Linux 目标平台。

    89530

    c和fortran混编

    gcc总是会有很多默认链接的库和链接选项,这其中包括c的标准库,而printf就在c标准库中。加上-v选项就可以看出来,gcc在编译和链接时 到底做了哪些事。...所以我们也需要类似c++的做法改变fortran程序编译出来的符号 名。 我不知道fortran是否有extern “C”之类的东东。但是编译fortran程序是有选项可选的。...c库, 而用gcc会担心链不到专有的库)。...像上面的例子最后的链接的使用g77最好,因为我的例子很简单,而你的有可能很复杂。 还想起来一件事,关于网上使用的例子有__stdcall的,那都是关于win api的。...Windows下动态链接库是很常见的东西,linux下也有,换了一个名字,叫 standard object,大多形如lib*.so。SO文件可以通过编译器的-shared选项得到。

    2K41

    【Linux】动静态库(超详细)

    可以用于手动优化或调试汇编代码。 .out 可执行文件,通常用于Linux系统生成的默认可执行文件。...注意:.exe文件只能在Windows操作系统上运行,而不能在其他操作系统(如Linux或macOS)上运行 当有多个不同的源文件中的main函数调用这些功能函数时,每次都要重新对这几个函数重复预处理...a/.so 让别人可以调用库中的函数,.h 告诉别人库中有哪些函数可以被调用,相当于函数使用的说明书 在使用第三方库的时候,需要指明库的名称 下面我们做库需要用到的文件如下: Main.c 文件 #include...:这是因为gcc在默认路径下是链接C/C++的库,它只知道哪些是内置的库,而不知道第三方库的存在 注意:这里的 main.c 的头文件用 ,表示在系统路径下 删去我们之前安装到系统的路径 sudo...手动调用静态库 当我们有了头文件和库文件的时候不安装到系统里,和静态库类似 c.

    60800

    C++静态链接

    Linux系统下一般程序的入口是“ start”,这个函数是 Linux系统库( Glibc)的一部分。...当我们的程序与Glbc库链接在一起形成最终可执行文件以后,这个函数就是程序的初始化部分的入口,程序初始化部分完成一系列初始化过程之后,会调用main函数来执行程序的主体。...API往往是指源代码级别的接口,比如我们可以说POSIX一个API标准Windows所规定的应用程序接口是一个API;而ABI是指二进制层面的接口,ABI的兼容程度比API要更为严格,比如我们可以说C+...API更关注源代码层面的,比如POSIX规定 printf(0)个函数的原型,它能保证这个函数定义在所有遵循POSⅨ标准的系统之间都是一样的,但是它不保证print 实际每个系统中执行时,是否按照从右到左将参数压入堆栈...寄存器使用约定,函数调用时哪些寄存器可以修改,哪些须要保存,等等; 当然这只是一部分因素,还有其他因素我们在此不一一列举了。

    2K10

    含大量图文解析及例程 | Linux下的ELF文件、链接、加载与库(中)

    该虚拟文件有6列,分别为: vdso的全称是虚拟动态共享库(virtual dynamic shared library),而vsyscall的全称是虚拟系统调用(virtual system call...),关于这部分内容有兴趣的读者可以看看https://0xax.gitbooks.io/linux-insides/content/SysCall/syscall-3.html。...这样就带来了两个弊端: 首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。...而且这只是链接了libc标准库,在大型项目中,我们要链接各种各样的第三方库,而静态链接会把全部在链接时就链接到同一个可执行文件,那么其大小是很难接受的。 动态库的出现正是为了弥补静态库的弊端。...包括但不限于:C/C++,Arm, Linux,Android,人工智能,单片机,树莓派,等等。在上面的【人人都是极客】公众号内回复「peter」,即可免费获取!!

    3.8K22

    【送书】帮你成为 CC++ 技术栈的熟练工

    掌握了汇编,你可以理解函数调用是如何实现的,你可以理解函数的几种调用方法,为什么printf这样的函数其调用方式不能是 __stdcall,而必须是 __cdecl。...作为一个开发者,要清楚地知道我们写的 C/C++ 程序是如何通过预处理、编译与链接等步骤最终变成可执行的二进制文件,操作系统如何识别一个文件为可执行文件,一个可执行文件包含什么内容,执行时如何加载到进程的地址空间...无论是 Windows 还是 Linux 操作系统,操作系统提供的线程同步对象就那么几种,Windows 常用的有临界区(关键端)、Event、互斥体、信号量等,Linux 有互斥体、信号量、读写锁、条件变量...理解和掌握常用的基础 socket API 不仅可以最大化地去定制各种网络通信框架,更不用说使用市面上流行的网络通信库了,最重要的是,它会是你排查各种网络疑难杂症坚实的技术保障。...这本书有什么内容? 这本书中详细地介绍了除了数据库以外、要掌握成为一名合格的 C++ 开发者需要掌握哪些知识。

    59810

    C++ 编译体系入门指北

    生成的目标文件通常以.o(在Unix-like系统中)或.obj(在Windows系统中)为后缀。 链接(Linking):链接器将一个或多个目标文件以及需要的库链接成一个可执行文件或库。...main.c 命令可以生成文件main.o 链接:通过gcc main.o可以生成a.out 可执行文件 编译工具链 编译工具链(Toolchain)是指一组用于将源代码转换为可执行文件或库的工具和程序...一个典型的编译工具链包括编译器、汇编器、链接器、库和调试器等组件。 Windows 平台主要使用微软提供的工具链——MSVC。 Linux 平台主要是GCC。...Conan 提供了一个中央仓库(Conan Center),开发者可以在其中发布和查找包。 vcpkg vcpkg 是由微软开发的 C++ 包管理器,专注于简化库的获取和集成。...vcpkg 提供了一个中央仓库,用户可以轻松地安装和管理库 Hunter Hunter 是另一个 C++ 包管理器,基于 CMake。

    1K21

    c++动态库和静态库的区别_静态库里面包含动态库

    l 可以实现进程之间的资源共享。(因此动态库也称为共享库) l 将一些程序升级变得简单。 l 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。...可能大家会猜测,是因为动态库跟测试程序不是一个目录,那我们验证下是否如此: 发现还是报错!!!那么,在执行的时候是如何定位共享库文件的呢?...显式加载一个C++动态库的困难一部分是因为C++的name mangling;另一部分是因为没有提供一个合适的API来装载类,在C++中,您可能要用到库中的一个类,而这需要创建该类的一个实例,这不容易做到...name mangling可以通过extern “C”解决。C++有个特定的关键字用来声明采用C binding的函数:extern “C” 。...如果options 中间有逗号,就将options分成多个选项,然后传递给链接程序。 nm命令 有时候可能需要查看一个库中到底有哪些函数,nm命令可以打印出库中的涉及到的所有符号。

    2.5K30

    编译原理基础

    许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。 GCC原本用C开发,后来因为LLVM、Clang的崛起,它更快地将开发语言转换为C++。...,也不是编译器的集合,它们只是一种驱动器,根据参数中的文件类型,调用对应的 GNU 编译器,所以更准确的说法是:gcc 调用了 C compiler, g++ 调用了C++ compiler。...)、库和可执行文件。...Linux 操作系统包涵了 Linux内核 与其他自由软件项目中的 GNU 组件和软件,可以被称为 GNU/Linux(见GNU/Linux命名争议)。...这些工具形成了一条工具链,用于开发应用程序和操作系统。 GNU 工具链在针对嵌入式系统的 Linux内核、BSD 及其它软件的开发中起着至关重要的作用。

    2.7K10
    领券