2012-06-15 75 views
10

有些東西,我不明白什麼時候鏈接...我正在編寫一個程序使用第三方庫(GEOS庫)。該程序對geos.lib具有依賴性,但仍需要運行geos.dll。程序靜態鏈接到一個庫,但仍然需要DLL運行

我讀this question,我想我明白靜態和動態庫之間的區別。我不明白的是爲什麼當我靜態鏈接一個庫時,我仍然需要一個dll。

回答

16

它不是靜態鏈接的。 .lib只是一個存根庫,可以在Windows上綁定.dll。也就是說,你在編譯時與.lib鏈接,然後在運行時它會去尋找.dll。

+0

是否有任何選項可以靜態鏈接特定.dll文件中的代碼? –

+1

我認爲你必須編譯靜態鏈接庫,我不確定你可以在編譯後將dll改成靜態鏈接庫。 –

+0

@Andrew所以dll文件總是帶有.lib文件?我如何知道.lib不夠用,我需要提供dll? – undu

0

您正在定義鏈接到動態庫。 僅僅因爲鏈接器需要.lib文件並不意味着你鏈接到一個靜態庫。

0

當且僅當這是一個靜態lib文件時,纔可以靜態鏈接lib文件。所以首先你需要將你的dll的項目轉換爲靜態庫,然後使用你的構建的產品,它將是一個靜態的.lib文件。

18

有3種庫在Windows上:

  • 對象庫(* .LIB)
  • 導入庫(* .LIB)
  • 動態鏈接庫(* .dll文件)

對象庫是靜態鏈接的。它們包含由庫提取的代碼的完整對象定義。

導入庫是對象庫的特殊形式。它不包含代碼,而是包含鏈接器的信息,最終將可執行文件映射到動態鏈接庫。

動態鏈接庫,如對象庫,爲您的程序提供代碼。但是,此代碼在運行時加載,並未編譯到您的exe文件中。

您並不總是需要鏈接導入庫。相反,您可以調用LoadLibrary()並按名稱或序號查找API入口點。 (您總是必須告訴代碼哪個DLL以及您要輸入的那個DLL的API在哪裏)

其他評論這裏是正確的,因爲您不能將DLL編譯爲靜態庫,而無需重新編譯庫的代碼 - 它是一種不同的輸出。

+4

[初學者指南](http://www.lurklurk.org/linkers /linkers.html)是一篇關於鏈接的偉大文章。我在研究這個完全相同的問題時發現它。 – Pressacco

1

如果.lib是由Visual Studio創建的,然後檢查項目屬性 - >鏈接器 - >輸入 - >模塊定義文件的值。如果它不是空的,即使項目屬性 - >常規 - >配置類型是「靜態庫(.lib)」,link.exe創建存根庫而不是靜態庫。

相關問題