C++编译运⾏过程中产⽣的各种⽂件
Windows中的obj,lib,dll,exe⽂件
lib是和dll对应的。lib是静态链接库的库⽂件,dll是动态链接库的库⽂件。
1、静态就是link的时候把⾥⾯需要的东西抽取出来安排到你的exe⽂件中,以后运⾏你的exe的时候不再需要lib。
孙红雷老婆2、动态就是exe运⾏的时候依赖于dll⾥⾯提供的功能,没有这个dll,你的exe⽆法运⾏。
Obj⽂件时编译成obj⽂件,是中间⽂件。lib,dll,exe都算是最终的⽬标⽂件,是最终产物。⽽c/c++属于源代码。源代码和最终⽬标⽂件中过渡的就是中间代码obj,实际上之所以需要中间代码,是你不可能⼀次得到⽬标⽂件。⽐如说⼀个exe需要很多的cpp⽂件⽣成。⽽编译器⼀次只能编译⼀个cpp⽂件。这样编译器编译好⼀个cpp以后会将其编译成obj,当所有必须要的cpp都编译成obj以后,再统⼀link成所需要
的exe,应该说缺少任意⼀个obj都会导致exe的链接失败。
1.obj⾥存的是编译后的代码跟数据,并且有名称,所以在连接时有时会出现未解决的外部符号的问题。当连成exe后便不存在名称的概念了,只有地址。lib就是⼀堆obj的组合。
2.理论上可以连接obj⽂件来引⽤其他⼯程(可以认为⼀个obj⽂件等价于编译⽣成它的cpp⽂件,可以引⽤obj来替换cpp,也可以添加cpp来替
换obj ),但实际中通常⽤lib来实现⼯程间相互引⽤。
3.编译器会默认链接⼀些常⽤的库,其它的需要你⾃⼰指定(例如GDAL/opencv等)。
lib和DLL的区别
(1)lib是编译时需要的,dll是运⾏时需要的。如果要完成源代码的编译,有lib就够了。如果也使动态连接的程序运⾏起来,有dll就够了。在开发和调试阶段,当然最好都有。
(2) ⼀般的动态库程序有lib⽂件和dll⽂件。lib⽂件是必须在编译期就连接到应⽤程序中的,⽽dll⽂件是运⾏期才会被调⽤的。如果有dll⽂件,那么对应的lib⽂件⼀般是⼀些索引信息,具体的实现在dll⽂件中。如果只有lib⽂件,那么这个lib⽂件是静态编译出来的,索引和实现都在其中。静态编译的lib⽂件有好处:给⽤户安装时就不需要再挂动态库了。但也有缺点,就是导致应⽤程序⽐较⼤,⽽且失去了动态库的灵活性,在版本升级时,同时要发布新的应⽤程序才⾏。
(3)在动态库的情况下,有两个⽂件,⼀个是引⼊库(.LIB)⽂件(实际上也算是⼀个静态库,只是在链接时只能把函数在DLL的⼊⼝链接
到exe中,⽽不像真正静态链接库那样将函数体真正链接到exe中 ,通过lib进⾏的动态链接实际上也使⽤了静态链接来实现 ),⼀个是DLL⽂件,引⼊库⽂件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应⽤程序使⽤LIB⽂件链接到所需要使⽤的DLL⽂件,库中的函数和数据并不复制到可执⾏⽂件中,因此在应⽤程序的可执⾏⽂件中,存放的不是被调⽤的函数代码,⽽是DLL中所要调⽤的函数的内存地址,这样当⼀个或多个应⽤程序运⾏是再把程序代码和被调⽤的函数代码链接起来,从⽽节省了内存资源。从上⾯的说明可以看文件夹加密码
出,DLL和.LIB⽂件必须随应⽤程序⼀起发⾏,否则应⽤程序将会产⽣错误。
英语发音软件DLL内的函数分为两种:
(1)DLL导出函数,可供应⽤程序调⽤;
立夏和夏至各代表什么意思(2)DLL内部函数,只能在DLL程序使⽤,应⽤程序⽆法调⽤它们
Linux中的.o,.so,.a⽂件
.o,是⽬标⽂件,相当于windows中的.obj⽂件;
金融市场包括 .so 为共享库,是shared object,⽤于动态连接的,相当于windows下的dll;
.a为静态库,是好多个.o合在⼀起,⽤于静态连接;
.o⽂件是链接⽂件,.a是静态库⽂件,靠.o⽂件⽣成,作为⼀个库为外部程序提供函数,接⼝。
⽣成.o⽂件:
gcc -c test.o test.c
⽣成.a⽂件:
ar cqs test.a test.o
买房子注意什么.o 就相当于windows⾥的obj⽂件,⼀个.c或.cpp⽂件对应⼀个.o⽂件
.a 是好多个.o合在⼀起,⽤于静态连接,即STATIC mode,多个.a可以链接⽣成⼀个exe的可执⾏⽂件.so 是shared object,⽤于动态连接的,和windows的dll差不多,使⽤时才载⼊。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论