簡體   English   中英

.h,.lib和.dll如何協同工作

[英]How does .h, .lib & .dll works together

要使用FreeGlut librarie功能,我必須執行以下操作,

  • 添加了freeglut.h作為頭文件
  • 添加了freeGlut.lib作為資源文件
  • 將freeGlut.dll復制到我的windows / SysWOW64文件夾

但是,整個系統(.h,.lib和.dll)如何相互關聯?

我知道,最基本的事情是添加一個帶有類聲明的頭文件,並在其各自的源文件中寫入正文。 最后將頭文件包含在主應用程序中。

您必須包含頭文件,以便編譯器能夠理解庫公開/使用的各種類型和函數的聲明。

庫文件(lib或dll)包含使用庫鏈接到的代碼所鏈接的目標代碼。

對於lib,鏈接是靜態的並且在編譯時發生。使用靜態庫(lib)會導致可執行文件的大小增加,因為整個lib鏈接到您的程序。

對於dll,鏈接是動態的,並且在運行時調用調用。當使用dll時,可執行文件的大小不會增加,因為dll在運行時鏈接,並且您通常需要將它們放在預定義的路徑上,以便它們可以在運行時鏈接。

靜態庫優於dll的優點是使用lib的可執行文件是獨立的,而在dll的情況下,dll需要存在於運行使用它的可執行文件的預定義路徑上。

頭文件聲明了所有內容,以便編譯器知道您將提供它。

.lib文件用於告訴鏈接器在哪里找到實現 - 通常它們只是打包在.lib本身,但在這種情況下你有一個導入庫,所以它說“在.DLL中我會動態加載在運行時“。

.dll文件是實現,在運行時加載。 通常你不會將它復制到你的系統文件夾,而是將它們留在你的.exe文件夾中。

.h文件是編譯步驟所必需的:它聲明了FreeGLUT中可用的函數,結構和簽名集,以便編譯器可以對它們進行編碼。

.lib文件是鏈接步驟所必需的:此時您將擁有一組引用FreeGLUT函數但沒有實際定義/實現的目標文件。 在這種情況下,它將它們定義為從FreeGLUT.DLL導入的DLL,在加載時解析。

.dll文件是代碼實際存在的位置,是運行時所必需的。 它需要在您的路徑中的某個位置,或者在您運行代碼的目錄中,以便Windows可以找到它。 請注意,SysWOW64幾乎肯定是錯誤的地方; 您需要設置Visual Studio以將其復制到bin \\ debug目錄中或將其放在其他位置並將該目錄添加到PATH環境中(然后重新啟動Visual Studio以將其拾取)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM