2011-02-09 25 views
1

經常試圖運行它使用DLL中的EXE時,如果缺少DLL你得到一個標準的Windows錯誤:EXE如何對DLL有靜態依賴關係?

The program can't start because XXX.dll is missing from your computer. Try reinstalling the program to fix this problem.

這似乎是內置的EXE您的任何代碼之前調用...它是如何工作的,以及在Visual Studio中構建項目時如何設置它們?

編輯:

在我的具體情況我居然有那麼如果這些都沒有出現,這對其他DLL「靜態」依賴一個DLL,註冊我的DLL失敗,這是一個有點難以診斷。但我寧願不手動列出使用的DLL函數,因爲有很多!

回答

7

當您鏈接到DLL時,有兩種方法可以執行此操作,即隱式鏈接和顯式鏈接。你遇到的是隱式鏈接的失敗。

隱式鏈接通過稱爲包含在使用PE(可執行可執行文件)格式的可執行映像中的導入表進行操作。 PE格式定義了導入和導出表。導出表包含由DLL導出的函數列表及其入口點。導入表包含對其他模塊的隱式依賴關係。

當可執行文件啓動時,加載器讀取導入表,然後嘗試加載所有引用的DLL以及這些DLL中的所有函數。如果找不到DLL,如果DLL未能正確加載,或者DLL不包含引用的函數,則可能會失敗。在你的情況下,它是失敗的,因爲加載程序沒有在DLL搜索路徑中找到XXX.dll

鏈接器將生成導入表。在C++中,這通常是通過該DLL的.lib文件完成的。

顯式鏈接是您的代碼調用LoadLibraryGetProcAddress加載DLL及其函數的地方。通常,當您要編寫可在不同系統上運行的應用程序時,會使用此方法。例如,您可能希望使用僅在特定版本的操作系統上存在的某些功能,但在較舊版本的操作系統上運行時會降級爲某些其他行爲。

術語靜態在引用鏈接到DLL時不應該使用。靜態鏈接是指一個函數的實現包含在圖像中,而不是包含在外部庫中。

該主題的MSDN article解釋了所有這些和更多。

+0

您鏈接的MSDN頁面使用術語'靜態'...無論如何,簡短的答案是通過添加DLL的相關.lib,我導致VS隱式鏈接DLL?但是,如果我不添加該.lib,因爲我調用.h文件中聲明的方法,所以我得到鏈接器錯誤。我可以告訴VS _not_隱式鏈接DLL,但仍然以相同的方式工作嗎? – 2011-02-09 11:27:31