天天看點

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.理論上可以連接配接obj檔案來引用其他工程(可以認為一個obj檔案等價于編譯生成它的cpp檔案,可以引用obj來替換cpp,也可以添加cpp來替換obj

),但實際中通常用lib來實作工程間互相引用。

    3.編譯器會預設連結一些常用的庫,其它的需要你自己指定。

lib和DLL的差別

    (1)lib是編譯時需要的,dll是運作時需要的。如果要完成源代碼的編譯,有lib就夠了。如果也使動态連接配接的程式運作起來,有dll就夠了

。在開發和調試階段,當然最好都有。

    (2) 一般的動态庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連接配接到應用程式中的,而dll檔案是運作期才會被調用的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實作在dll檔案中。如果隻有lib檔案,那麼這個lib檔案是靜态編譯出來的,索引和實作都在其中。

靜态編譯的lib檔案有好處:給使用者安裝時就不需要再挂動态庫了。但也有缺點,就是導緻應用程式比較大,而且失去了動态庫的靈活性,在版本更新時,同時要釋出新的應用程式才行。

    (3)在動态庫的情況下,有兩個檔案,一個是引入庫(.LIB)檔案(實際上也算是一個靜态庫,隻是在連結時隻能把函數在DLL的入口連結到exe中,而不像真正靜态連結庫那樣将函數體真正連結到exe中

,通過lib進行的動态連結實際上也使用了靜态連結來實作

),一個是DLL檔案,引入庫檔案包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和資料,應用程式使用LIB檔案連結到所需要使用的DLL檔案,庫中的函數和資料并不複制到可執行檔案中,是以在應用程式的可執行檔案中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的記憶體位址,這樣當一個或多個應用程式運作是再把程式代碼和被調用的函數代碼連結起來,進而節省了記憶體資源。從上面的說明可以看出,DLL和.LIB檔案必須随應用程式一起發行,否則應用程式将會産生錯誤。

DLL内的函數分為兩種:

    (1)DLL導出函數,可供應用程式調用;

    (2)DLL内部函數,隻能在DLL程式使用,應用程式無法調用它們

建立靜态連結庫和建立動态連結庫

    VC6中建立[Win32 Dynamic-Link Library]工程便可以建立出一個空的DLL工程.

    VC6中建立[Win32 Static Library]工程便可以建立出一個空的LIB工程(靜态連結庫工程,僅生成一個lib檔案).

繼續閱讀