(1)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檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。
問題:一直沒搞清楚編譯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就屬於隱式鏈結。
lib檔案和dll檔案
什麼是lib檔案,lib和dll的關係如何 1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,...
LIB檔案和DLL檔案的作用
1 lib是編譯時需要的,dll是執行時需要的。如果要完成源 的編譯,有lib就夠了。如果也使動態連線的程式執行起來,有dll就夠了。在開發和除錯階段,當然最好都有。2 一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有d...
dll生成lib檔案
如何從dll檔案匯出對應的lib檔案?visual c 開發工具提供了兩個命令列工具,乙個是dumpbin.exe,另乙個是lib.exe。利用這兩個工具即可從dll匯出其對應的lib。1 在命令列執行 dumpbin exports yourdll.dll yourdll.def exports ...