.obj, .lib, .dll, .exe的关系

.obj, .lib, .dll, .exe的关系

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文件必须随应用程序一起发行,否则应用程序将会产生错误。