obj,dll,lib,exe总结

一个现代编译器的主要工作流程如下:

源程序(source code)→预处理(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code)→连接器(链接器,Linker)→可执行程序(executables,exe)

编译:

当前源代码编译成二进制目标文件(.obj文件)

链接(link):

将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe)

lib和dll

  • 包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
  • 包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。

共有两种链接方式:

  • 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
  • 静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。

总的来说,lib是静态的库文件,dll是动态的库文件。所谓静态就是link的时候把里面需要的东西抽取出来安排到你的exe文件中,以后运行,你的exe运行的时候不再需要lib。所谓动态就是exe运行的时候依赖于dll里面提供的功能。没有这个dll,你的exe无法运行。

lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果要完成源代码的编译,有lib就够了。如果也使动态链接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。

静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。

参考链接:DLL与LIB库文件的生成和使用

 一般我们最主要的关于lib文件的麻烦就是出现unresolved symble 这类错误,这就是lib文件连接错误或者没有包含.c、.cpp文件到工程里,关键是如果在C++工程里用了C语言写的lib文件,就必需要这样包含:
extern "C" 

#include "myheader.h" 

这是因为C语言写的lib文件没有C++所必须的名字破坏,C函数不能被重载,因此连接器会出错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值