首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么.o (目标文件)链接比.lib (静态库)更快?

目标文件(.o文件)和静态库(.lib文件)都是编译过程中生成的中间文件,用于最终生成可执行文件。目标文件包含了编译后的机器代码和符号表信息,而静态库则是将多个目标文件打包成一个文件,方便在链接阶段使用。

.o文件链接比.lib文件更快的原因有以下几点:

  1. 链接过程中的符号解析:在链接过程中,目标文件需要进行符号解析,即将函数和变量的引用与定义进行匹配。由于.o文件只包含了当前目标文件的符号信息,链接器只需要解析当前目标文件的符号表,而.lib文件包含了多个目标文件的符号信息,链接器需要解析整个库的符号表,因此.o文件的符号解析速度更快。
  2. 链接过程中的重定位:链接过程中,目标文件需要进行重定位,即将代码中的绝对地址转换为相对地址。由于.o文件只包含了当前目标文件的代码段,链接器只需要进行当前目标文件的重定位,而.lib文件包含了多个目标文件的代码段,链接器需要进行整个库的重定位,因此.o文件的重定位速度更快。
  3. 链接过程中的文件大小:由于.lib文件包含了多个目标文件的代码和符号信息,因此.lib文件的大小通常比单个.o文件大。在链接过程中,需要读取和处理的数据量更大,因此链接速度相对较慢。

总结起来,.o文件链接比.lib文件更快是因为.o文件只包含了当前目标文件的符号和代码信息,链接过程中的符号解析和重定位只需要处理当前目标文件,而.lib文件包含了多个目标文件的信息,链接过程中需要处理更多的数据量,导致链接速度较慢。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

linux学习 建立静态,动态,写简单的makefile

建立静态 建立四个文件 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(放源文件目标

4.5K10

Linux详解

的种类 为了便于理解,将程序可以分为三种类型:静态、共享和动态加载(DL) 2.1 静态 Linux下静态以.a结尾的文件 静态实际上是一些目标文件的集合,在生成可执行文件阶段进行链接...Linux下编译源码时源文件经过编译生成.o目标文件,.o目标文件链接阶段经过链接生成可执行程序。...所以在链接阶段可以链接.o目标文件,也可以把所有.o目标文件进行打包,统一进行链接,因此打包.o文件生成的文件,就是静态。...因此,可执行程序在运行的时候需要共享的支持。调用共享的可执行程序静态链接出来的可执行程序要小,当多个程序调用共享时,运行时所占用内存空间静态的方式要小。...三种对比 特点 静态 静态链接在程序编译时会被链接目标代码中,目标程序运行时将不再需要,移植方便,但是体积较大,因为所有相关的库内容都被链接合成一个可执行文件,这样导致可执行文件的体积较大

2K40

linux动态静态

;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)根本就没有被加载到

12.2K20

C语言 | 什么是静态链接和动态链接

但是为什么包含这个头文件就可以使用里面的函数呢?...静态其实就是商业公司将自己的函数源代码经过只编译不链接形成.o目标文件,然后用ar工具将.o文件归档成.a的归档文件(.a的归档文件又叫静态链接文件)。...商业公司通过发布.a文件和.h头文件来提供静态给客户使用。动态链接静态链接出现的晚一些,效率更高一些,是改进型的。现在我们一般都是使用动态。...*.o *.a 这里的lib目标里面的两行代码就是生成静态的代码。...这个.a文件就是静态文件lib后面的是文件名称。制作出来了静态之后,发布时只需要发布.a文件和.h文件。以上就是静态链接的制作过程。

4.2K40

静态与动态的那些事

(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包含函数内容,此时,可以观察出libdll小很多:...静态链接使用静态链接链接器从静态链接LIB获取所有被引用函数,并将同代码一起放到可执行文件中。 关于lib和dll的区别如下: (1)lib是编译时用到的,dll是运行时用到的。

1.5K00

linux 动态 静态_静态库里面包含动态

可以很明显的看到动态链接文件大小明显要比静态链接文件大小要小多了,这是为什么呢?...其实,动态链接是当执行到要调用的接口时,编译器会自动去搜寻所链接,而静态链接则是暴力的将所要用的中可执行程序使用的二进制代码全部拷贝到我们生成的可执行文件中,这也就是为什么静态链接生成的文件这么大的原因了...一个与动态链接的可执行文件仅仅包含它用到的函数入口地址的一个表(头文件),而不是外部函数所在目标文件(.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文件是已经编译好但还没有链接的两个文件

7.3K20

Linux基础IO【软硬链接与动静态

/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...可以看看以上三种方式生成的可执行程序大小: 静态链接生成的程序动态链接大得多,并且内含静态的动态链接程序,也纯粹的动态链接程序大,说明程序不是 非静即动,可以同时使用动态静态 ----

24220

Linux编译gccg++、自动化构建工具makemakefile

:把c编程汇编语言 汇编:把汇编变成二进制(不是可执行,二进制目标文件链接:把写的代码和c标准中的代码合起来 gcc的格式:gcc [选项] 要编译的文件 [选项] [目标文件] [wjmhlh...接下来,就是函数的作用了! 函数一般分为静态和动态 静态是指编译链接时,把文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要文件了。...动态与之相反,在编译链接时并没有把文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载,这样可以节省系统的开销,即形成的可执行程序小。 动态链接:好处:形成的可执行程序小。...在执行静态链接的时候,拷贝的是.so内部的代码吗? NO!系统里面必须存在.a结尾的静态。...在静态链接的时候,会将静态的代码拷贝过去。一般来说,系统会自带动态,而静态需要自己安装。 同样的对于c++,一样有自己的C++标准,动静态

2K20

Linux下文件制作方法详解

参数 含义 -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 动态加载 上面共享的调用属于动态链接方法,此外我们还可以动态加载

2K30

浅谈Linux的动态链接

我们把编译后但是还未链接的二进制机器码文件称为目标文件(Object File),那些第三方是其他人编译打包好的目标文件,这些库里面包含了一些函数,我们可以直接调用而不用自己动手写一遍。...在编译构建自己的可执行文件时,使用静态链接的方式,其实就是将所需的静态目标文件打包到一起。最终的可执行文件除了有自己的程序外,还包含了这些第三方的静态,可执行文件比较臃肿。...比如,我们使用了printf()函数,printf()函数对应有一个目标文件printf.o静态链接时,会把printf.o链接打包到可执行文件中。...静态链接的任何函数有了改动,除了静态链接本身需要重新编译构建,依赖这个函数的所有可执行文件都需要重新编译构建一遍。...到/etc/ld.so.cache文件里,链接器根据缓存可以更快地查找到各个.so文件

8.6K30

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

回顾一下,将一个程序编译成可执行程序的步骤: 图:编译过程 静态 之所以成为【静态】,是因为在链接阶段,会将汇编生成的目标文件.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

1.7K30

【一站式解惑】Linux中.a、.so和.o文件以及-I,-L,LIBRARY_PATH,LD_LIBRARY_PATH等

lib静态链接文件,dll是动态链接文件。 所谓静态就是link的时候把里面需要的东西抽取出来放到你的exe文件中,以后运行你的exe的时候不再需要lib。...(3)在动态的情况下,有两个文件,一个是引入库(.LIB文件(实际上也算是一个静态,只是在链接时只能把函数在DLL的入口链接到exe中,而不像真正静态链接那样将函数体真正链接到exe中 ,通过lib...函数分为静态和动态两种。静态在程序编译时会被链接目标代码中,程序运行时将不再需要该静态。...我们删除静态文件,试试公用函数hello是否真的链接目标文件 hello中了。...程序照常运行,静态中的公用函数已经链接目标文件中了。 我们继续看看如何在Linux中创建动态。我们还是从.o文件开始。

3.7K52

这篇文章不知道起什么名字

:关闭所有优化选项 -O1:第一级别优化,使用此选项可使可执行文件更小,运行更快,并不会增加太多编译时间,可以简写为-O -O2:第二级别优化,采用了几乎所有优化技术,使用此选项会延长编译时间 -O3:...名参数,但通过ldd命令查看时,找不到指定链接的.so文件,此时需要通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态的目录,通过此做法可解决无法链接的问题。...配合-E选项使用 -static:在支持动态链接的系统上,阻止链接共享。...创建并使用静态链接方法 编写C源文件,设为static_lib.c,其中写入需要重复调用的函数,然后使用命令gcc -c static_lib.c生成目标文件static_lib.o 使用ar工具创建静态.../static_lib.a -o app编译生成可执行文件app 创建并使用动态方法 编写C源文件share_lib.c,写入需要重复调用的函数,然后使用命令gcc -shared -FPIC -o

70730

静态和动态的区别

静态: 之所以成为【静态】,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。...试想一下,静态与汇编生成的目标文件一起链接为可执行文件,那么静态必定跟.o文件格式相似。...其实一个静态可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件静态库特点总结: 1、静态对函数链接是放在编译时期完成的。...2、程序在运行时与函数再无瓜葛,移植方便。 3、浪费空间和资源,因为所有相关的目标文件与牵涉到的函数链接合成一个可执行文件。...通过上面的介绍发现静态,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态呢? 为什么还需要动态为什么需要动态,其实也是静态的特点导致。 1、空间浪费是静态的一个问题。 ?

1.9K90

动态静态的特性

静态 静态函数实际上就是简单的一个普通的目标文件的集合,一般来说习惯用“.a”作为文件的后缀。 静态函数,是在程序执行前就加入到目标程序中去了 。...静态的后缀是.a,它的产生分两步(linux下) 由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 ar命令将很多.o转换成.a,成文静态 Android中需要设定Android.mk...优缺点 静态的优点 (1) 代码装载速度快,执行速度略动态链接快; (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题...而使用运行时动态链接,系统不会终止,但由于so中的导出函数不可用,程序会加载失败;速度静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。...使用 静态链接 静态使用静态链接的方法。 动态也可以使用静态链接。 动态使用静态链接的时候,载入代码就会把程序会用到的动态代码或动态代码的地址确定下来。

1.8K10

GCC写个给你玩,就这?

在这里插入图片描述 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详细使用视频」

1K10

一文带你了解静态和动态

目标文件 在解释静态和动态之前,需要简单了解一下什么是目标文件。...首先第一条命令会将main.c编译成可重定位目标文件main.o,第二条命令的static参数,告诉链接器应该使用静态链接,-lm参数表明链接libm.a这个(类似的,如果要链接libxxx.a,使用...链接器从左往右扫描可重定位目标文件静态 扫描libm.a,由于前面没有任何未解析的符号,因此不会提取任何代码 扫描main.o,发现未解析的符号exp 扫描结束,还有一个未解析的符号,因此编译链接报错...有什么区别 到这里我们大致了解了静态和动态的区别了,静态被使用目标代码最终和可执行文件在一起(它只会有自己用到的),而动态与它相反,它的目标代码在运行时或者加载时链接。...加载速度不一样 由于静态链接时就和可执行文件在一块了,而动态在加载或者运行时才链接,因此,对于同样的程序,静态链接的要比动态链接加载更快。所以选择静态还是动态是空间和时间的考量。

93420

文件系统

思考——为什么下载软件卸载慢呢? 因为下载是真实的把数据写到磁盘中,而卸载只要把inode和数据直接的链接断开就可以,不需要把数据清空,再次下载其他软件的时候,只需要进行数据的覆盖就可以。...下面我们就要把他们制成静态。 先把他们编译成.o文件 打包——ar -rc libmylib.a .o文件 **注意:**的写法:前缀必须是lib开头的,后缀必须以.a结尾。...gcc默认的搜索路径是:/usr/include 文件的默认搜索路径是:/lib64 或者 /usr/lib64 我们可以把静态的头文件以及文件拷贝到gcc的默认搜索路径下;但是这样会污染里面的文件.../MyLib/lib/ -lmylib 解释一下: -I是指定头文件的路径 -L是指定文件的路径 -l(这个是小L)是指明文件路径下的哪一个。 动态 为什么使用动态?...gcc -shared 由上一步生成的.o文件 -o 动态 上面我们就制作好了动态。 gcc默认是链接的动态。 如果我们直接按照静态的方法进行运行,发现不可以运行成功。

48420

Linux下动态(.so)和静态(.a) 的区别

.o为扩展名的中间目标文件名,可以多个并列 参数        意义 -r            将objfile文件插入静态尾或者替换静态中同名文件 -x            从静态文件中抽取文件...d1.o,d2.o*/ g++ -shared -o libd1.so d1.o    /*根据中间目标文件d1.o创建动态文件d1.so*/ g++ -shared -o libd2.so d2....o    /*根据中间目标文件d2.o创建动态文件d2.so*/ 或者直接一步到位  g++ -O -fpic -shared -o libd1.so d1.cpp  g++ -O -fpic.../libd.so (0xb7f0f000)  //这个动态文件静态编译多的         libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7e2b000...隐式调用动态静态使用方法一致,使用静态和使用动态编译成目标程序使用的gcc命令完全一样,那当静态和动态同名时,gcc命令会使用哪个文件呢?

16.5K21
领券