簡體   English   中英

C ++,Visual Studio 2012,LIB,DLL,包含,源和鏈接器

[英]C++, Visual Studio 2012, LIBs, DLLs, Includes, Source and Linker

我試圖了解這些是什么以及它們如何相互關聯(最重要的是,如何安裝它們)。

根據我的閱讀, LIB是在項目編譯期間鏈接的庫, DLL是在項目運行期間鏈接的庫。

所以對我來說使用LIB ,我必須在我的計算機的某個地方有實際的.LIB文件,轉到Project - > Properties - > VC ++ Directories並在Library Directories中添加文件的路徑,然后我必須轉到鏈接器 - > 輸入 - > 附加依賴項在那里添加.lib名稱,最后我需要在我的代碼中鍵入#include ,對吧?

所以,有些問題:

  1. 當我完成並構建我的程序版本時,如果目標平台的PC也安裝了.lib,那么.exe只能運行嗎? 如果是,我需要采取哪些步驟來確保.lib與.exe一起使用?

  2. 當我獲得一個開源項目的源代碼時,如果我將它們(使用Add Existing Item ...添加到我的項目中,我是否可以僅使用#include來使用它們,就像文件是我的一樣,它將是相同的安裝.lib? 或者我是否需要安裝.lib文件並仍然使用這些源文件?

  3. 我有一個使用OpenGL的項目,我鏈接到glew32.lib ,但我沒有在VC ++目錄中添加lib或任何新目錄,所以我認為這意味着我必須在系統文件夾中安裝.lib或在Visual Studio不會要求另一個目錄的地方,在發布項目時我是否應該擔心這個問題?

  4. 以上問題如何與DLL相關 ,是否有任何理由為什么我應該使用DLL而不是LIB?

我開始使用越來越多的庫,我注意到我只是拖動,復制並將它包含在任何地方,所以我可以使用它們,但從未真正理解它們如何“適合”項目。 特別是那些提供如此多文件的開源庫,我真的不知道如何處理它們......

  1. 您不需要將LIB文件與EXE文件一起在另一台計算機上運行,​​LIB文件是靜態文件,DLL文件是動態的。 因此,當您編譯所有靜態代碼時,將包含在您的EXE文件中,但DLL文件將在運行時動態加載和使用,因此您只需要將您的DLL文件與EXE文件一起使用。 這樣,您的代碼就可以在其他計算機上正常運行。

  2. 僅添加另一個項目是不夠的,您需要編譯它們並從中生成LIB文件。 然后將生成的LIB文件添加到最終項目中,並在最終二進制文件中包含外部項目。 如果要在解決方案中一起編譯多個項目,則需要在VS中的解決方案屬性中設置項目構建順序。

  3. 不,那沒關系。 您似乎已將LIB文件放在正確的文件夾中,並且您不需要將LIB文件與EXE文件一起在其他計算機上運行。

  4. DLL是動態庫,因此您需要將它們與您的應用程序一起使用。 安裝程序通常會在同一文件夾中安裝帶有DLL文件的EXE文件,因此您的應用程序將正常運行,但根本不需要包含LIB文件。

您還可以包含以下LIB文件:

#pragma comment(lib, "glew32.lib")

因此,您不需要在項目設置中執行此操作,但假設您的LIB文件位於“庫目錄”路徑中。

使用DLL文件可以通過兩種方式完成:一種是將應用程序鏈接到DLL文件,並在EXE文件的導入表中包含DLL文件的函數:如使用

#include <windows.h>

然后

GetWindowsDirectory(windir, MAX_PATH);

因此,您將在EXE文件的導入表中輸入GetWindowsDirectory API。

你也可以動態地做到這一點:

hinstDLL = LoadLibrary("kernel32.dll");
if (hinstDLL != NULL)
{
    func_GetWindir = (DLLPROC) GetProcAddress(hinstDLL, "GetWindowsDirectoryA");
...

沒有太大的區別,唯一的區別是:在第一種方法,因為它是在你的EXE文件的導入表,如果沒有kernel32.dll或沒有GetWindowsDirectory在進入kernel32.dll ,你的EXE不會跑的話,那將顯示嚴重錯誤,不會運行。 但是以動態方式(第二種方式),您的應用程序將運行,但只要您的代碼嘗試使用GetWindowsDirectoryA API,它就會失敗。 你將在func_GetWindir擁有0x00 如果您嘗試調用它,程序將崩潰。

暫無
暫無

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

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