.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别)

 

.obj, .lib, .dll, .exe 的关系(附: lib DLL 的区别) 收藏

lib 是和 dll 对应的。   

  lib 是静态的库文件, dll 是动态的库文件。   

  所谓静态就是 link 的时候把里面需要的东西抽取出来安排到你的 exe 文件中,以后运行   

  你的 exe 的时候不再需要 lib   

  所谓动态就是 exe 运行的时候依赖于 dll 里面提供的功能,没有这个 dll ,你的 exe 无法运   

  行。   

   

  lib,   dll,   exe 都算是最终的目标文件,是最终产物。而 c/c++ 属于源代码。源代码和最终   

  目标文件中过渡的就是中间代码 obj ,实际上之所以需要中间代码,是你不可能一次得到目   

  标文件。比如说一个 exe 需要很多的 cpp 文件生成。而编译器一次只能编译一个 cpp 文件。这   

  样编译器编译好一个 cpp 以后会将其编译成 obj ,当所有必须要的 cpp 都编译成 obj 以后,再统   

  link 成所需要的 exe ,应该说缺少任意一个 obj 都会导致 exe 的链接失败。

 

1.obj 里存的是编译后的代码跟数据,并且有名称,所以在连接时会出现未解决的外部符号一说。当连成 exe 后便不存在名称的概念了,只有地址。 lib 就是一堆 obj 的组合。   

  2. 理论上可以,但实际中通常用 lib   

  3. 编译器会默认链接一些常用的库,其它的需要你自己指定。

 

附上 lib DLL 的区别

 

(1)lib 是编译时需要的, dll 是运行时需要的。

如果要完成源代码的编译,有 lib 就够了。

如果也使动态连接的程序运行起来,有 dll 就够了。

在开发和调试阶段,当然最好都有。

(2) 一般的动态库程序有 lib 文件和 dll 文件。 lib 文件是必须在编译期就连接到应用程序中的,而 dll 文件是运行期才会被调用的。如果有 dll 文件,那么对应的 lib 文件一般是一些索引信息,具体的实现在 dll 文件中。如果只有 lib 文件,那么这个 lib 文件是静态编译出来的,索引和实现都在其中。静态编译的 lib 文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

(3) 在动态库的情况下,有两个文件,一个是引入库( .LIB )文件,一个是 DLL 文件,引入库文件包含被 DLL 导出的函数的名称和位置, DLL 包含实际的函数和数据,应用程序使用 LIB 文件链接到所需要使用的 DLL 文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是 DLL 中所要调用的函数的内存地址,这样当一个或多个应用程序运行是再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出, DLL .LIB 文件必须随应用程序一起发行,否则应用程序将会产生错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值