2012-09-20 65 views
10

我的項目是一個獨立的C++應用程序,它使用FMOD播放聲音。我以前用Visual Studio 2010開發過相同的工程,沒有任何問題,但是2012給了我一個經典的錯誤:「程序無法啓動,因爲fmodex.dll從你的計算機中丟失了,請嘗試重新安裝程序來解決這個問題。 「該項目似乎加載其他DLL(如Direct3d相關文件和d3d着色器編譯器)就好了。使用Visual Studio 11 RC進行調試時找不到DLL依賴關係

只有在嘗試從IDE調試或運行程序時,纔會出現此問題,而不是如果將可執行文件複製到具有DLL的相應目錄並手動運行該程序。如果我從程序中刪除對FMOD的所有引用,則調試和運行正常。我確定我在Project設置中有正確的工作目錄(除了在同一個目錄中加載其他所有文件)。我最初從Visual Studio 2010轉換項目,但試圖從頭開始創建一個新項目,但沒有運氣。我也修改了所有可能的編譯器和鏈接器設置,並且使用谷歌搜索似乎也沒有幫助。

我在猜測這個問題與新的Metro風格應用程序有關,它是處理外部依賴項的方法,但我也關閉了「Metro風格應用程序支持」。我開始認爲我真的嘗試了所有我能做的事,並且不知道下一步該做什麼。獲取更多診斷信息的方向也將非常感謝!謝謝!

編輯:我使用的Visual Studio版本的Visual Studio 2012旗艦版的RC版本11.0.50706.0 QRELRC 2012年7月

+0

像往常一樣與DLL的問題,_have你試圖依賴Walker_?特別是,分析模式? – MSalters

回答

16

轉到項目的屬性:

Configuration Properties | Debugging | Environment 

,並添加以下項目:

PATH=c:\path\where\the\dll-is;$(Path) 
+0

聽起來可能就是這樣!當我下班回家時必須嘗試! – hhatinen

+0

非常好!那釘了這個問題。謝謝! – hhatinen

+0

這會讓你在調試器中運行程序,但它不能解決程序沒有正確查找它的DLL的問題。即,如果其他人在其他地方設置當前目錄的情況下運行該程序,則它也會失敗。 (例如,如果通過命令提示符運行該程序,這很常見。) –

0

這可能是VS運行具有不同的當前目錄中的應用時,您手動運行應用程序。

VS通常會將當前目錄設置爲項目文件夾,這通常與構建的二進制文件所在的文件夾不同。當你手工運行它時,可能是從後者運行它,而不是前者。

如果這是問題,那麼加載fmodex.dll的代碼必須取決於DLL搜索路徑中的當前目錄,這可能存在很大的安全風險(查找「DLL植入」或DLL「預加載」 ),並被某些Windows配置主動阻止。

+0

當前目錄應該沒問題(如果你是指項目設置中的工作目錄)。但是你可能就在那裏,調試器似乎主動阻止程序從當前目錄加載DLL。我繼續嘗試一些甚至比把fmodex.dll複製到我的本地System32文件夾更厲害的東西,並且程序似乎開始很好。 – hhatinen

2

我的同情,我似乎最近生活在DLL地獄。兩個建議:

  1. 您可以從devenv命令行具有/useenv開關驅動的IDE。

    "... Use PATH, INCLUDE, LIBPATH, and LIB environment variables instead of IDE paths for VC++ builds.

  2. dumpbin /dependents [*.exe] [*.dll]將向您顯示DLL依賴關係。

    dumpbin /dependents openssl.exe

Microsoft (R) COFF/PE Dumper Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file openssl.exe

File Type: EXECUTABLE IMAGE

Image has the following dependencies:

SSLEAY32.dll 
LIBEAY32.dll 
WSOCK32.dll 
MSVCR80.dll 
KERNEL32.dll 

Summary 

    4000 .data 
    14000 .rdata 
    1000 .rsrc 
    33000 .text 
+0

/useenv開關似乎使VS無法打開項目。它爲每個項目輸出以下錯誤:'F:\ Program Files \ MSBuild \ Microsoft.Cpp \ v4.0 \ V110 \ Microsoft.Cpp.Common.props(63,3):導入的項目「G:\ build \ CommonConfiguration \ Neutral \ sdk.props「未找到。確認聲明中的路徑是正確的,並且該文件存在於磁盤上。(F是visual studio所在的磁盤,G是項目所在的位置,儘管沒有G:\ build目錄..)。 – hhatinen