使用Visual Studio 11 RC进行调试时,DLL依赖项未找到。

15
我的项目是一个独立的C ++应用程序,使用FMOD播放声音。我之前使用Visual Studio 2010开发了相同的项目,没有任何问题,但是在2012中出现了经典错误:“程序无法启动,因为fmodex.dll在您的计算机上丢失。请尝试重新安装程序以解决此问题。”该项目似乎能够正常加载其他DLL(例如Direct3d相关文件和d3d着色器编译器)。

只有当从IDE尝试调试或运行程序时才会出现问题,而手动将可执行文件复制到带有DLL的适当目录并运行它则没有问题。如果我从程序中删除所有对FMOD的引用,则调试和运行将正常工作。我确保在项目设置中具有正确的工作目录(除了它可以在同一目录中正常加载所有其他文件)。我最初是从Visual Studio 2010转换项目,但是尝试从头开始创建新项目也没有成功。我已经尝试了所有可能的编译器和链接器设置,并且搜索谷歌也没有帮助。

我想问题与新的Metro样式应用程序以及其处理外部依赖项的方式有关,但我也关闭了“Metro样式应用程序支持”。我开始觉得我已经尽力而为,不知道接下来该尝试什么。非常感谢提供更多诊断信息的指导!

编辑:我使用的Visual Studio版本是Visual Studio Ultimate 2012 RC,版本11.0.50706.0 QRELRC July,2012


通常在处理DLL问题时,_您尝试过Dependency Walker_吗?特别是使用分析模式? - MSalters
3个回答

26

打开项目属性页面:

Configuration Properties | Debugging | Environment 

并添加以下项目:

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

听起来可能就是这样!回家后要试一下! - hhatinen
太好了!问题解决了。谢谢! - hhatinen
这将让您在调试器中运行程序,但它并没有解决程序没有正确查找其DLL的问题。也就是说,如果其他人在设置了不同的当前目录下运行程序,它们也会失败。(例如,如果您通过命令提示符运行程序,这是很常见的情况。) - Leo Davidson
迈克尔的建议对我没用。然后我把DLL放到Debug目录中,然后它就起作用了。 - user1741137
实际上我忘记设置PATH= - user1741137
显示剩余2条评论

2

我同情你,最近似乎经常陷入DLL地狱。这里有两个建议:

  1. 你可以使用带有 /useenv 开关的 devenv 命令行驱动IDE。

    "... 对于VC++构建,请使用PATH、INCLUDE、LIBPATH和LIB环境变量代替IDE路径。

  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 

/useenv开关似乎会导致VS完全无法打开项目。对于每个项目,它都会输出以下错误:F:\Program Files\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Common.props(63,3): The imported project "G:\build\CommonConfiguration\Neutral\sdk.props" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.(F是Visual Studio所在的磁盘,G是项目所在的磁盘,但是没有G:\build目录..)。 - hhatinen

0

可能是因为VS使用不同的当前目录运行应用程序,而您手动运行应用程序时使用的是另一个当前目录。

通常,VS将当前目录设置为项目文件夹,这通常与构建二进制文件的文件夹不同。当您手动运行它时,您可能是从后者而不是前者运行的。

如果这是问题所在,则加载fmodex.dll的代码必须依赖于当前目录位于DLL搜索路径中,这可能会带来巨大的安全风险(查找“DLL植入”或DLL“预加载”),并且某些Windows配置已经主动阻止了此类操作。


当前目录应该没问题(如果你指的是项目设置中的工作目录)。但你可能是对的,调试器似乎正在积极阻止程序从当前目录加载DLL。我尝试了比将fmodex.dll复制到本地System32文件夹更激烈的方法,而程序似乎开始运行得很好。 - hhatinen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接