什么是lib文件,lib和dll的關系如何
如果要完成源代碼的編譯,有lib就夠了。
如果也使動態連接的程序運行起來,有dll就夠了。
在開發和調試階段,當然最好都有。
(2)一般的動態庫程序有lib文件和dll文件。lib文件是必須在編譯期就連接到應用程序中的,而dll文件是運行期才會被調用的。如果有dll文件,那么對應的lib文件一般是一些索引信息,具體的實現在dll文件中。如果只有lib文件,那么這個lib文件是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib文件有好處:給用戶安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程序比較大,而且失去了動態庫的靈活性,在版本升級時,同時要發布新的應用程序才行。
(3)在動態庫的情況下,有兩個文件,一個是引入庫(.LIB)文件,一個是DLL文件,引入庫文件包含被DLL導出的函數的名稱和位置,DLL包含實際的函數和數據,應用程序使用LIB文件鏈接到所需要使用的DLL文件,庫中的函數和數據並不復制到可執行文件中,因此在應用程序的可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址,這樣當一個或多個應用程序運行是再把程序代碼和被調用的函數代碼鏈接起來,從而節省了內存資源。從上面的說明可以看出, DLL和.LIB文件必須隨應用程序一起發行,否則應用程序將會產生錯誤。
selected from: http://topic.csdn.net/t/20020927/11/1057549.html
問題:
一直沒搞清楚編譯dll后生成的lib文件到底是干什么用的?如果采用靜態連接,為什么老是需要lib文件?而通過loadlibrary則不需要?如果是靜態連接,是否我的dll程序一旦改動而從新編譯過后,就還需要從新編譯調用dll的程序?
答案匯總:
(rivershan)
程序員在建立一個DLL文件時,鏈接程序會自動生成一個與之對應的LIB導入文件。該文件包含了每一個DLL導出函數的符號名和可選的標識號,但是並不含有實際的代碼。LIB文件作為DLL的替代文件被編譯到應用程序項目中。
當程序員通過靜態鏈接方式編譯生成應用程序時,應用程序中的調用函數與LIB文件中導出符號相匹配,這些符號或標識號進入到生成的EXE文件中。LIB文件中也包含了對應的DLL文件名(但不是完全的路徑名),鏈接程序將其存儲在EXE文件內部。當應用程序運行過程中需要加載DLL文件時,Windows根據這些信息發現並加載DLL,然后通過符號名或標識號實現對DLL函數的動態鏈接。所有被應用程序調用的DLL文件都會在應用程序EXE文件加載時被加載在到內存中。可執行程序鏈接到一個包含DLL輸出函數信息的輸入庫文件(.LIB文件)。操作系統在加載使用可執行程序時加載DLL。可執行程序直接通過函數名調用DLL的輸出函數,調用方法和程序內部其他的函數是一樣的。
(stonespace)
調用dll的export函數是不需要lib的,dll本身就是和lib同一個級別的東西,也提供類似的功能,調用dll函數只需要loadlibrary就行,但是你也發現,用loadlibrary很麻煩,要取出函數的地址,然后還要定義一個調用的原型。用dll比用靜態鏈接庫lib要麻煩得多。
微軟為了解決這個問題,在編譯dll的時候,順便生成一個引入庫lib文件,這個lib不包含實際功能代碼,只不過用來幫你做那些loadlibrary的麻煩工作,讓你用dll和用一般的lib一樣方便。
dll改過之后,只要export函數的聲明沒有修改,也就是參數、函數名、返回值沒有發生變化,調用代碼不需要重新編譯。不過export函數聲明修改過就必須重編譯。
(alphapiao)
使用動態dll有兩種方法,一種是隱式鏈接,一種顯示鏈接,如果用loadlibrary就是顯示鏈接,用lib就屬於隱式鏈接。