2014-02-17 49 views
3

我想知道究竟是什麼以及它們如何相互關聯(最重要的是,如何安裝它們)。C++,Visual Studio 2012,LIB,DLLs,Includes,Source和Linker

從我讀過,LIBS是我的項目的編譯和的DLL是我的項目運行期間鏈接庫中鏈接庫。

所以對我來說使用LIB,我必須有實際的.lib文件的地方在我的電腦,去項目 - >屬性 - >VC++目錄和路徑添加到文件在庫目錄,並在此之後我得去鏈接 - >輸入 - >附加依賴​​在裏面添加的.lib名字,最後我需要鍵入的#include我C頌歌,對嗎?

因此,一些問題:

  1. 當我完成和建立我的程序的發佈,將在目標平臺已經安裝在他們的電腦上的.lib以及.exe文件只運行?如果是,我需要執行哪些步驟來確保.lib與.exe一起使用?

  2. 當我得到一個開源項目的來源,如果我(使用添加現有項...)將它們添加到我的項目,我能使用的#include,就好像這些文件都是我用它們並且它將與安裝.lib一樣?或者我需要安裝.lib文件並仍然使用這些源文件?

  3. 我有一個項目使用OpenGL和我聯繫到glew32.lib,但我沒有lib或在VC++目錄添加任何新的目錄,所以我想這意味着我意有所指將.lib安裝在系統文件夾或Visual Studio不會要求其他目錄的地方,我應該在發佈項目時擔心這個問題嗎?

  4. 上述問題如何與DLL相關聯,並且有什麼理由爲什麼我應該使用DLL來通過LIB或其他方式?

我開始使用越來越多的圖書館,我發現我剛纔拖動,複製及包括它無處不在,所以我可以使用他們,但從來沒有真正瞭解他們是如何「適應」項目。尤其是當它們提供了這麼多的文件,我真的不知道如何處理它們做那些開源庫...

回答

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

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

  3. 不,沒關係。看起來你已經將LIB文件放在正確的文件夾中,並且不需要將EXIB文件的LIB文件在其他計算機上運行。

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

您也可以包括LIB文件是這樣的:

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

所以你不需要做,在項目設置,但假設你在「庫目錄」路徑的LIB文件。

使用DLL文件可以通過兩種方式來完成: 一種是將您的應用程序的DLL文件,並在你的EXE文件的導入表的DLL文件的函數入口:喜歡使用

#include <windows.h> 

然後

GetWindowsDirectory(windir, MAX_PATH); 

因此,您的EXE文件的Import Table中會包含GetWindowsDirectory API條目。

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

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

沒有太大的區別,唯一的區別是: 在第一種方法,因爲它是在你的EXE文件的導入表,如果沒有kernel32.dll或有kernel32.dll中沒有GetWindowsDirectory條目,您的EXE根本無法運行,它將顯示嚴重錯誤並且無法運行。但以動態方式(第二種方式),您的應用程序將運行,但只要您的代碼嘗試使用GetWindowsDirectoryA API,它就會失敗。您將有0x00func_GetWindir。如果你試圖調用它,那麼程序會崩潰。

+0

關於#4,我設法編譯OpenAL和freealut(兩個開放源代碼庫),它們也編譯了一個.DLL,如果我只在我的項目中鏈接/添加文件夾,它表示項目不能因爲計算機中缺少LIBRARY.DLL,因此請啓動它。這是否意味着我必須以某種方式將這些.DLL與我的.EXE一起發送?我設法通過將.DLL放入Windows/sys32和sys64文件夾來啓動該項目,但是有沒有辦法將它們放在項目文件夾中? – Danicco

+0

您可以將它們放在EXE文件的相同文件夾中或System32或Windows文件夾中,不要擔心,將它們放在EXE文件的相同文件夾中,它將起作用 –