VS2015 编译输出的*.lib,*.dll,*.exe的区别
生活随笔
收集整理的這篇文章主要介紹了
VS2015 编译输出的*.lib,*.dll,*.exe的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
VS2015編譯完C++程序后,一般會在Release或者Debug文件路徑下生成多個文件:
例如:輸出文件夾下會出現(xiàn)這些文件:*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb;*.cpp,*.dsp,*.ncb,*.plg
(1)生成可執(zhí)行文件(路徑——.\ceshi\x64\Release)
其中,ceshi.exe:是生成的可執(zhí)行文件;ceshi.obj:是目標(biāo)文件,源程序編譯后的產(chǎn)物;*.pdb:全稱是Program DataBase,即程序數(shù)據(jù)庫文件,用來記錄調(diào)試信息
(2)生成靜態(tài)庫(路徑——.\ceshi\x64\Release)
其中,dongtaiku.lib:是一個二進(jìn)制文件,與dll類似,供其他程序調(diào)用。區(qū)別是:dll是運行時需要的,lib是編譯時需要的。
(3)生成動態(tài)鏈接庫(路徑——.\ceshi\x64\Release)
其中,*.ilk:當(dāng)選定漸增型編譯連接時,連接器自動生成ILK文件,記錄連接信息;*.pch:全稱是PreCompiled Header,就是預(yù)先編譯好的頭文件;*.idb:文件保存的信息,使編譯器在重新編譯的時候只重編譯最新改動過的函數(shù)和只對最新類定義改動過的源文件進(jìn)行重編譯,以提高編譯速度
? ? ? ? 另外,*.dsp:(全稱是Developer Studio Project)也是一個配置文件;*.ncb:(全稱No Compile Browser)的縮寫,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC開發(fā)環(huán)境自動生成;*.plg:實際上是一個超文本文件,可以用Internet Explorer打開,記錄了Build的過程;*.cpp:就是C++源代碼文件.
?
lib和dll的介紹。
(1)lib是靜態(tài)的庫文件
(2)dll是動態(tài)的庫文件。 ??
? 所謂靜態(tài)就是link的時候把里面需要的東西抽取出來安排到你的exe文件中,供運行你的exe,這時候不再需要靜態(tài)庫lib。
所謂動態(tài)就是exe運行的時候依賴于dll里面提供的功能,沒有這個dll,你的exe無法運 ??
? 行。
lib, ? dll, ? exe都算是最終的目標(biāo)文件,是最終產(chǎn)物——輸出
而c/c++屬于源代碼——輸入
源代碼和最終目標(biāo)文件中過渡的就是中間代碼obj,實際上之所以需要中間代碼,是你不可能一次得到目標(biāo)文件。比如說一個exe需要很多的cpp文件生成。而編譯器一次只能編譯一個cpp文件。這樣編譯器編譯好一個cpp以后會將其編譯成obj,當(dāng)所有必須要的cpp都編譯成obj以后,再統(tǒng)一link成所需要的exe,應(yīng)該說缺少任意一個obj都會導(dǎo)致exe的鏈接敗。
?
1.obj里存的是編譯后的代碼跟數(shù)據(jù),并且有名稱,所以在連接時會出現(xiàn)未解決的外部符號一說。當(dāng)連成exe后便不存在名稱的概念了,只有地址。lib就是一堆obj的組合。
?2.理論上可以,但實際中通常用lib。
?3.編譯器會默認(rèn)鏈接一些常用的庫,其它的需要你自己指定。
lib和dll的區(qū)別
(1)lib是編譯時需要的,dll是運行時需要的。如果要完成源代碼的編譯,有l(wèi)ib就夠了。?
如果也使動態(tài)連接的程序運行起來,有dll就夠了。在開發(fā)和調(diào)試階段,當(dāng)然最好都有。
(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)庫了。但也有缺點,就是導(dǎo)致應(yīng)用程序比較大,而且失去了動態(tài)庫的靈活性,在版本升級時,同時要發(fā)布新的應(yīng)用程序才行。
(3)在動態(tài)庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個或多個應(yīng)用程序運行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來,從而節(jié)省了內(nèi)存資源。從上面的說明可以看出,DLL和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)a(chǎn)生錯誤。
?
?
總結(jié)
以上是生活随笔為你收集整理的VS2015 编译输出的*.lib,*.dll,*.exe的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.从单应矩阵中分离得到内参和外参(需要
- 下一篇: 【OpenCV3】双线性插值