obj,lib,dll,exe
obj,lib,dll,exe的關(guān)系
??? lib是和dll對應(yīng)的。lib是靜態(tài)鏈接庫的庫文件,dll是動態(tài)鏈接庫的庫文件。
??? 所謂靜態(tài)就是link的時候把里面需要的東西抽取出來安排到你的exe文件中,以后運行你的exe的時候不再需要lib。
??? 所謂動態(tài)就是exe運行的時候依賴于dll里面提供的功能,沒有這個dll,你的exe無法運行。
???
??? lib,dll,exe都算是最終的目標文件,是最終產(chǎn)物。而c/c++屬于源代碼。源代碼和最終目標文件中過渡的就是中間代碼obj,實際上之所以需要中間代碼,是你不可能一次得到目標文件。比如說一個exe需要很多的cpp文件生成。而編譯器一次只能編譯一個cpp文件。這樣編譯器編譯好一個cpp以后會將其編譯成obj,當所有必須要的cpp都編譯成obj以后,再統(tǒng)一link成所需要的exe,應(yīng)該說缺少任意一個obj都會導致exe的鏈接失敗。
???
??? 1.obj里存的是編譯后的代碼跟數(shù)據(jù),并且有名稱,所以在連接時有時會出現(xiàn)未解決的外部符號的問題。當連成exe后便不存在名稱的概念了,只有地址。lib就是一堆obj的組合。
??? 2.理論上可以連接obj文件來引用其他工程(可以認為一個obj文件等價于編譯生成它的cpp文件,可以引用obj來替換cpp,也可以添加cpp來替換obj ),但實際中通常用lib來實現(xiàn)工程間相互引用。
??? 3.編譯器會默認鏈接一些常用的庫,其它的需要你自己指定。
???
lib和DLL的區(qū)別
??? (1)lib是編譯時需要的,dll是運行時需要的。如果要完成源代碼的編譯,有l(wèi)ib就夠了。如果也使動態(tài)連接的程序運行起來,有dll就夠了 。在開發(fā)和調(diào)試階段,當然最好都有。
??? (2) 一般的動態(tài)庫程序有l(wèi)ib文件和dll文件。lib文件是必須在編譯期就連接到應(yīng)用程序中的,而dll文件是運行期才會被調(diào)用的。如果有dll文件,那么對應(yīng)的lib文件一般是一些索引信息,具體的實現(xiàn)在dll文件中。如果只有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的,索引和實現(xiàn)都在其中。 靜態(tài)編譯的lib文件有好處:給用戶安裝時就不需要再掛動態(tài)庫了。但也有缺點,就是導致應(yīng)用程序比較大,而且失去了動態(tài)庫的靈活性,在版本升級時,同時要發(fā)布新的應(yīng)用程序才行。
??? (3)在動態(tài)庫的情況下,有兩個文件,一個是引入庫(.LIB)文件(實際上也算是一個靜態(tài)庫,只是在鏈接時只能把函數(shù)在DLL的入口鏈接到exe中,而不像真正靜態(tài)鏈接庫那樣將函數(shù)體真正鏈接到exe中 ,通過lib進行的動態(tài)鏈接實際上也使用了靜態(tài)鏈接來實現(xiàn) ),一個是DLL文件,引入庫文件包含被DLL導出的函數(shù)的名稱和位置,DLL包含實際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數(shù)和數(shù)據(jù)并不復制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當一個或多個應(yīng)用程序運行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)a(chǎn)生錯誤。
DLL內(nèi)的函數(shù)分為兩種:
??? (1)DLL導出函數(shù),可供應(yīng)用程序調(diào)用;
??? (2)DLL內(nèi)部函數(shù),只能在DLL程序使用,應(yīng)用程序無法調(diào)用它們
創(chuàng)建靜態(tài)鏈接庫和創(chuàng)建動態(tài)鏈接庫
??? VC6中創(chuàng)建[Win32 Dynamic-Link Library]工程便可以創(chuàng)建出一個空的DLL工程.
??? VC6中創(chuàng)建[Win32 Static Library]工程便可以創(chuàng)建出一個空的LIB工程(靜態(tài)鏈接庫工程,僅生成一個lib文件).
添加lib文件的常用辦法有二個:
??? 1、把*.lib放在VC的Lib目錄中
??? 2、修改project setting的Link->Input中的Addtional library path,加入你的目錄dll:是可實際運行的二進制代碼,有定位代碼的!
??? 3、也可以在object/library中直接寫上lib文件路徑.(這里實際上是可以寫上任意obj文件或者lib文件的).
有個個人的方法:當有時間提示缺少某個標示符什么的時候,通過文件搜索工具(TC可以直接搜索二進制文件的)搜索這個標識符(一般函數(shù)名),找到它被放到哪里了,然后引用就好了,:-)
總結(jié)
以上是生活随笔為你收集整理的obj,lib,dll,exe的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim 使用技巧 转载
- 下一篇: InstallShield 2011新功