) 输入命令gcc -c code.s -o code.o -c的意思是开始进行程序的翻译,汇编完成就停下来 我们生成的code.o文件是不能执行的,并且可以重定位目标二进制文件的 4、链接(生成可执行文件或者库文件...,直接拷贝到我们的可执行程序中 所以这就是被为什么我们采用静态链接时候我们的可执行程序的大小比动态链接的时候大了 因为静态链接不再依赖任何库 我们这里的图比较形象 将我们视为可执行程序 学校视作内存 网吧视作动态库...生成的 .o 文件是目标文件。 2. 链接阶段 目标文件链接为可执行文件: gcc file.o -o output g++ file.o -o output 3....创建静态库: gcc -c file1.c file2.c # 编译生成目标文件 ar rcs libmylib.a file1.o file2.o # 创建静态库 ar 是静态库管理工具。...三、动静态库的选择 对比项 静态库 动态库 文件大小 可执行文件较大,库内容嵌入其中 可执行文件较小,运行时需要库文件支持 运行效率 加载速度更快,无需查找库文件 运行时加载,可能略慢 共享能力 不支持共享
,你需要把它重定向到一个输出文件里面 -S 编译到汇编语言不进行汇编和链接 -c 编译到目标代码 -o 文件输出到 文件 -static 此选项对生成的文件采用静态链接 -g 生成调试信息。...test.s gcc -c test.s -o test.o 03.函数库与动静态链接 在软件开发中,链接是将一个或多个编译后的目标文件(.o文件)和库文件合并,生成可执行文件或更大的库文件的过程。...静态链接 定义:在静态链接中,链接器(如GNU的 ld)将所有用到的库文件的内容复制到最终的可执行文件中。...性能:在某些情况下,静态链接的应用程序启动和运行速度可能会更快,因为避免了运行时解析库符号的开销。 缺点: 文件大小:可执行文件会包含所有静态链接的库的代码,这会显著增加文件大小。...具体来说,make会比较目标文件和其依赖文件的修改时间戳。如果依赖文件比目标文件更新,则目标文件需要重新构建。
库的种类 为了便于理解,将程序库可以分为三种类型:静态库、共享库和动态加载(DL)库 2.1 静态库 Linux下静态库以.a结尾的库文件 静态库实际上是一些目标文件的集合,在生成可执行文件阶段进行链接...Linux下编译源码时源文件经过编译生成.o的目标文件,.o的目标文件在链接阶段经过链接生成可执行程序。...所以在链接阶段可以链接.o的目标文件,也可以把所有.o的目标文件进行打包,统一进行链接,因此打包.o文件生成的文件,就是静态库。...因此,可执行程序在运行的时候需要共享库的支持。调用共享库的可执行程序比静态库链接出来的可执行程序要小,当多个程序调用共享库时,运行时所占用内存空间比静态库的方式要小。...三种库对比 库 特点 静态库 静态链接库在程序编译时会被链接到目标代码中,目标程序运行时将不再需要库,移植方便,但是体积较大,因为所有相关的库内容都被链接合成一个可执行文件,这样导致可执行文件的体积较大
建立静态库 建立四个文件 bin(可运行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件里运行 1)gcc -c add.c //编译add.c.../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)...../include(放头文件) 生成add.o目标文件 gcc -shared -o libadd.so add.o 生成libadd.so动态库 这个库的名是add 将这个库放在根文件夹的lib文件中.../include(放头文件) (注意这里写的库名,没有lib和.so) 动态库与静态库比較: 动态库仅仅在运行的时候才被链接使用 动态库能够被多个程序使用,所以也称共享库 静态库将会整合大程序中,程序运行是不用夹在静态库...,因此静态库会是程序臃肿难以升级,但比較easy部署 动态库便于升级,但不easy部署 使用makefile 三个文件 bin(可运行文件),include(头文件),src(放源文件) 目标项
;nm查看库中包含那些函数、ar生成静态库,查看库中包含那些.o文件、ldd查看程序依赖的.so文件;gcc/g++与库相关的参数-L,-l,-fPIC,-shared;静态库链接时搜索过程;动态库链接时...一、静态库解析符号引用: 链接器ld是如何使用静态库来解析引用的。在符号解析阶段,链接器从左至右,依次扫描可重定位目标文件(*.o)和静态库(*.a)。...2、如果f是一个静态库(.a),那么链接器将尝试匹配U中未解析符号与静态库成员(静态库的成员就是.o文件)定义的符号。...此时,静态库f中任何不包含在E中的成员目标文件都将丢弃,链接器将继续下一个文件。 3、当所有输入文件完成后,如果U非空,链接器则会报错,否则合并和重定位E中目标文件,构建出可执行文件。...到这里,为什么会有库的依赖问题已经得到解答: 因为libchild.a依赖于libbase.a,但是libbase.a在libchild.a的左边,导致libbase.a中的目标文件(*.o)根本就没有被加载到
2、编译:将预处理后的文件转换成汇编语言,生成.s文件 3、汇编:汇编变为目标代码(机器代码)生成.o的文件。 4、链接:连接目标代码,生成可执行程序。在链接之前,各个头文件都是独立进行编译的。...各个头文件编译的过程互不干扰。 三.实现动静态库 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。...我们知道通过".o"文件链接,也可执行代码,所以我们要把main.c生成属于main.c的二进制目标文件。 到现在,有点像库的意思了。...-l:链接动态库,只要库名即可(去掉lib以及版本号)· -L:链接库所在的路径 -I(大写):指明头文件的路径。 运行完成。 我们生成的明明是静态库,这里怎么是动态链接呢?...这是因为我们的动态库既没有在系统指明路径下,也没有在当前路径下(比代码所在路径深一层)。所以系统会找不到库的位置。
但是为什么包含这个头文件就可以使用里面的函数呢?...静态库其实就是商业公司将自己的函数库源代码经过只编译不链接形成.o的目标文件,然后用ar工具将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接库文件)。...商业公司通过发布.a库文件和.h头文件来提供静态库给客户使用。动态链接库比静态链接库出现的晚一些,效率更高一些,是改进型的。现在我们一般都是使用动态库。...*.o *.a 这里的lib目标里面的两行代码就是生成静态库的代码。...这个.a文件就是静态库文件,lib后面的是库文件名称。制作出来了静态库之后,发布时只需要发布.a文件和.h文件。以上就是静态链接库的制作过程。
可以很明显的看到动态链接的文件大小明显要比静态链接的文件大小要小多了,这是为什么呢?...其实,动态链接是当执行到要调用的接口时,编译器会自动去搜寻所链接的库,而静态链接则是暴力的将所要用的库中可执行程序使用的二进制代码全部拷贝到我们生成的可执行文件中,这也就是为什么静态链接生成的文件这么大的原因了...一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表(头文件),而不是外部函数所在目标文件(.o)的整个机器码 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中...打包静态库 由于生成静态库需要先生成目标文件(.o)再进行打包,故先编写相应的源文件再将其编译成目标文件: [lyl@VM-4-3-centos 2022-3-14]$ gcc -c add.c -o...add.o #生成目标文件 [lyl@VM-4-3-centos 2022-3-14]$ gcc -c sub.c -o sub.o #生成目标文件 此时的add.o和sub.o文件是已经编译好但还没有链接的两个文件
(4)链接(Linking) 实现功能: 链接就是将多个目标文件以及所需的库文件链接生成可执行目标文件的过程。 命令: $ gcc test.o -o test -o本质上是一个重命名选项。...静态库 静态库(.a 、.lib) 1.静态库是在汇编过程生成的,加载静态态库是在链接过程之前 2.静态库实际就是一些目标文件(一般以.o结尾)的集合,静态库一般以.a结尾,只用于生成可执行文件阶段。...$ gcc -shared -fPIC -o libtest.so test.o 根据前面对动态库,静态库的理解,下面进一步理解动态链接库,静态链接库 根据上面的理解,以为lib为静态库,dll为动态库...lib分两种: (1) lib包含所有内容的静态库,应用程序用它即可,这是我上面理解的一种 (2) lib只包含头部信息,为了配合dll使用,dll包含函数内容,此时,可以观察出lib比dll小很多:...静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。 关于lib和dll的区别如下: (1)lib是编译时用到的,dll是运行时用到的。
/usr/lib64/libstdc* 无论是 C语言 还是 C++,在编写程序时,一定离不开库文件,比如之前模拟实现的 FILE 类型,就位于 stdio.h 这个库中,动态库优势比静态库明显,因此在编译代码时...静态库的打包主要分为以下两步: 将源文件进行 预处理->编译->汇编,生成可链接的二进制 .o 文件 通过指令将 .o 文件打包为静态库 将文件编译为 .o 二进制文件 gcc -c myadd.c...mysub.c 将所有的 .o 文件打包为一个静态库(库名自定义) 其中的 mycalc 为库名 ar -rc libmycalc.a *.o ar 是 GNU 提供的归档工具,常用来将目标文件打包为静态库...,此时需要加上 -fPIC 与位置无关码 通过 gcc/g++ 直接目标程序(此时不需要使用 ar 归档工具) 将源文件编译为 .o 二进制文件,此时需要带上 fPIC 与位置无关码 gcc -c -fPIC...可以看看以上三种方式生成的可执行程序大小: 静态链接生成的程序比动态链接大得多,并且内含静态库的动态链接程序,也比纯粹的动态链接程序大,说明程序不是 非静即动,可以同时使用动态库与静态库 ----
库有两种: 静态库 .a[Linux]、.lib[windows] 动态库 .so[Linux]、.dll[windows] 也可以理解为.o系列文件集合打包;那么为啥需要库呢?...说白了就是静态库会把对应的那一堆.o文件拷贝进可执行文件(这里对于动态库就不行了,后面我们细讲)。 其次就是,我们静态库要有lib和以.a后缀,然而库名是去掉这些。...下面形成静态库需要这几步: 1·把全部.c文件编译成.o。 2·把.o文件都打包生成静态库。 3·使用静态库与目标文件链接形成可执行程序。 这样我们就生成了.o文件。 完成静态库的形成。...下面我们来查看一下可执行程序的动态链接情况: 这里发现所要动态链接的动态库无法找到,为什么呢? GCC!=系统;静态库,系统可以从EXE中找到但是动态库找不到 。...如果我们就是想用动态的话;可以-static 强转一下: 这里就是告诉系统要用静态链接了。 五·目标文件分步编译和链接 : 肯定大家有个疑问,为什么把它们俩分开呢?
:把c编程汇编语言 汇编:把汇编变成二进制(不是可执行,二进制目标文件) 链接:把写的代码和c标准库中的代码合起来 gcc的格式:gcc [选项] 要编译的文件 [选项] [目标文件] [wjmhlh...接下来,就是函数库的作用了! 函数库一般分为静态库和动态库 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。...动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销,即形成的可执行程序小。 动态链接:好处:形成的可执行程序小。...在执行静态链接的时候,拷贝的是.so内部的代码吗? NO!系统里面必须存在.a结尾的静态库。...在静态链接的时候,会将静态库的代码拷贝过去。一般来说,系统会自带动态库,而静态库需要自己安装。 同样的对于c++,一样有自己的C++标准库,动静态库。
我们把编译后但是还未链接的二进制机器码文件称为目标文件(Object File),那些第三方库是其他人编译打包好的目标文件,这些库里面包含了一些函数,我们可以直接调用而不用自己动手写一遍。...在编译构建自己的可执行文件时,使用静态链接的方式,其实就是将所需的静态库与目标文件打包到一起。最终的可执行文件除了有自己的程序外,还包含了这些第三方的静态库,可执行文件比较臃肿。...比如,我们使用了printf()函数,printf()函数对应有一个目标文件printf.o,静态链接时,会把printf.o链接打包到可执行文件中。...静态链接库的任何函数有了改动,除了静态链接库本身需要重新编译构建,依赖这个函数的所有可执行文件都需要重新编译构建一遍。...到/etc/ld.so.cache文件里,链接器根据缓存可以更快地查找到各个.so文件。
参数 含义 -c 激活预处理、编译和汇编,把程序做成目标文件(.o文件) -g 在编译的时候产生调试信息 -Wall 生成警告信息 -l 指定链接时需要的动态库。...目标文件需要创建成位置无关码,概念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方 -shared 生成动态链接库 我们编写两个函数并将文件制作成库文件,用下面相同的代码分别制作静态库和共享库...(int a, int b) { return (a - b); } 制作静态库 首先生成.o目标文件 gcc -c Test.c ar命令将目标文件生成.a静态库文件 ar -cr...执行可执行程序 在执行可执行程序时,出现以下错误,说找不到库文件,在继续往下看之前大家想想这是为什么?...,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 动态加载库 上面共享库的调用属于动态链接方法,此外我们还可以动态加载
回顾一下,将一个程序编译成可执行程序的步骤: 图:编译过程 静态库 之所以成为【静态库】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。...因此对应的链接方式称为静态链接。 试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。...其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。静态库特点总结: l 静态库对函数库的链接是放在编译时期完成的。...创建静态库(.a) 通过上面的流程可以知道,Linux创建静态库过程如下: l 首先,将代码文件编译成目标文件.o(StaticMath.o) g++ -c StaticMath.cpp 注意带参数...-c,否则直接编译为可执行文件 l 然后,通过ar工具将目标文件打包成.a静态库文件 ar -crv libstaticmath.a StaticMath.o 生成静态库libstaticmath.a
动静态库 ✈️初识动静态库 其实我们在Windows下很可能也见识过动静态库,比如 xxx.dll 或者 xxx.lib 它们分别是Windows下的动态库文件和静态库文件,而在Linux他们的后缀又有所不同...图中也可以看到静态链接的可执行程序文件大小比动态库大得多。我们也可使用ldd和file命令查看: 静态库优点:静态链接的可执行程序,是将静态库拷贝到自己的可执行程序中,所以其可移植性高、部署简单。...这说明可执行文件独立于系统上的其他库,并且包含了程序运行所需的所有代码和数据。 ✈️动静态库的制作和使用 在说之前,我们有一件事情需要明白,为什么我们需要库?...mystdio.o ar -rc $@ $^ rm *.o#删除静态库目标文件 %.o:%.c gcc -c $< libmyc.so:mymath.o mystdio.o gcc...a mylib/lib cp -rf *.so mylib/lib 有个小细节,因为静态库与动态库生成的.o文件不同,所以生成静态库之后就需要把生成的.o文件删除。
main1.o,然后再将这写目标文件链接起来,最终形成一个可执行程序。...实际上,所有库本质都是一堆目标文件(xxx.o)的集合,库的文件当中并不包含主函数而只是包含了大量的方法以供调用,所以说动静态库本质是可执行程序的“半成品”。...,比动态链接生成的可执行程序的文件大小要大得多。...-r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件。 -c(create):建立静态库文件。...此时才能成功使用我们自己打包的库文件并生成可执行程序。 为什么之前使用gcc编译的时候没有指明过库名字?
静态库 静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。 静态函数库,是在程序执行前就加入到目标程序中去了 。...静态库的后缀是.a,它的产生分两步(linux下) 由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 ar命令将很多.o转换成.a,成文静态库 Android中需要设定Android.mk...优缺点 静态库的优点 (1) 代码装载速度快,执行速度略比动态链接库快; (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题...而使用运行时动态链接,系统不会终止,但由于so中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。...使用 静态链接 静态库使用静态链接的方法。 动态库也可以使用静态链接。 动态库使用静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来。
在这里插入图片描述 gcc常用参数 选项名 作用 -o 产生目标(.i、.s、.o、可执行文件等) -E 只运行C预编译器 -S 告诉编译器产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s -...-o hello.o #对汇编文件进行编译,生成了目标文件 gcc hello.o -o hello #对目标文件进行链接,生成可执行文件 gcc hello.c -o hello #直接编译链接成可执行目标文件...库文件有两种,静态库和动态库(共享库) 「静态库(.a)」:程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。静态库比较占用磁盘空间,而且程序不可以共享静态库。...a : 后缀(固定) ◆ 「Windows」 : libxxx.lib Linux生成静态库 首先准备几个文件和文件夹,文件树形结构 [root@deroy]# tree . ├── calc │...「缺点」 ◆ 加载速度比静态库慢 ◆ 发布程序时需要提供依赖的动态库 发送「关键字」获取「Linux安装配置视频」 和「GCC详细使用视频」
lib是静态链接库的库文件,dll是动态链接库的库文件。 所谓静态就是link的时候把里面需要的东西抽取出来放到你的exe文件中,以后运行你的exe的时候不再需要lib。...(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件(实际上也算是一个静态库,只是在链接时只能把函数在DLL的入口链接到exe中,而不像真正静态链接库那样将函数体真正链接到exe中 ,通过lib...函数库分为静态库和动态库两种。静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。...我们删除静态库文件,试试公用函数hello是否真的链接到目标文件 hello中了。...程序照常运行,静态库中的公用函数已经链接到目标文件中了。 我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。
领取专属 10元无门槛券
手把手带您无忧上云