10.14 .obj, .lib, .dll, .exe之間的相互關係

一、.obj

每一個.cpp文件在編譯時都會生成對應的.obj。.obj文件內部是相對地址。

二、.lib

分二類:靜態鏈接庫.lib 和 動態鏈接庫dll的導入庫.lib。

靜態鏈接庫.lib是.obj文件的集合,就是多個.obj文件的打包。.lib不會對.obj文件進行鏈接。生成靜態鏈接.lib時,編譯器不會進行鏈接操作。

動態鏈接庫dll的導入庫.lib是對應dll文件中導出函數的地址表,這些函數的具體實現依然放在.dll中。

因為靜態庫.lib生成時不會發生鏈接操作,只是打包.lib文件,所以即使A-lib使用了B-lib,在生成A-lib時,A-lib中也只含有A程序中的所有cpp文件生成的.obj,不會有B程序中的.obj。

這個時候使用A-lib的程序就需要將A-lib和B-lib同時加到自己的lib依賴中,這樣才能保證程序鏈接成功。

三、.dll

.dll是可執行格式的文件,它是將多個.obj文件進行鏈接後生成的可執行文件。

.dll支持二種鏈接方式:隱式鏈接和顯式鏈接。

使用隱式鏈接時,使用.dll的程序需要將與該dll對應的導入庫.lib鏈接到項目中。這樣,在程序執行時,就知道從哪個dll的哪個地方加載函數。

使用顯式鏈接時,不需要導入.lib,但要自己通過編程接口LoadLibrary和GetProcAddress等來告訴使用.dll的程序需要加載哪個dll的哪個函數。

隱式鏈接只適用於自己的項目,因為dll的代碼修改後,相應的導入lib也改變,這個時候需要重新鏈接使用該dll的程序,這樣才能保證使用dll的程序根據導入庫.lib中給定的函數地址找到其在dll中的代碼。

顯式鏈接適用於第三方庫。即使自己的dll代碼發生了修改,只要相應的接口沒有改變,那麼使用該dll庫的程序都不需要修改。

四、.exe

.exe是可執行格式的文件。

小結:

1,使用靜態lib的程序在鏈接時,要求其使用到的所有靜態lib都能找到,包括該程序使用的靜態lib引用的靜態lib;

2,使用dll的程序在運行時,要求其使用到的所有dll都能找到,包括該程序使用的dll引用的dll。


分享到:


相關文章: