一、.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。
閱讀更多 讀樂樂傳送門 的文章