C++编译/运行过程中产生的各种文件

参考:https://blog.csdn.net/weixin_39609623/article/details/82348576

 

  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差不多,使用时才载入。

posted @ 2019-03-28 14:07  努力奋斗的阿贝拉  阅读(2613)  评论(0编辑  收藏  举报