【问题标题】:DLL dependency not found when debugging with Visual Studio 11 RC使用 Visual Studio 11 RC 进行调试时未找到 DLL 依赖项
【发布时间】:2012-09-20 17:51:45
【问题描述】:

我的项目是一个独立的 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,2012 年 7 月

【问题讨论】:

  • 像往常一样遇到 DLL 问题,您是否尝试过 Dependency Walker?特别是分析模式?

标签: c++ dll visual-studio-2012 fmod


【解决方案1】:

转到项目的属性:

Configuration Properties | Debugging | Environment 

并添加以下项目:

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

【讨论】:

  • 听起来可能就是这样!下班回家一定要试试!
  • 太棒了!这解决了这个问题。谢谢!
  • 这会让你在调试器中运行程序,但它不能解决程序没有正确查找其 DLL 的问题。即,如果其他人在其他地方设置当前目录的情况下运行程序,那么他们也会失败。 (例如,如果您通过命令提示符运行程序,这很常见。)
  • @Leo:我的印象是 DLL 将根据关于它在 IDE 之外工作的评论部署/安装在应用程序目录中。但是,您是对的,如果还没有解决这个问题,则需要解决,并且此解决方案仅用于在 IDE 中进行调试。
  • 是的,DLL 将随程序一起部署。问题是我无法从 IDE 调试程序。
【解决方案2】:

我的同情,我最近似乎生活在 DLL 地狱中。两个建议:

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

    "... 使用 PATH、INCLUDE、LIBPATH 和 LIB 环境变量,而不是 VC++ 构建的 IDE 路径。

  2. dumpbin /dependents [*.exe] [*.dll] 将显示 DLL 依赖项。

    dumpbin /dependents openssl.exe

Microsoft (R) COFF/PE Dumper 版本 10.00.40219.01 版权所有 (C) 微软公司。版权所有。 转储文件 openssl.exe

文件类型:可执行图像

图片有以下依赖:

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 目录..)。
【解决方案3】:

可能是 VS 正在使用与手动运行应用程序时不同的当前目录运行应用程序。

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

如果这是问题所在,那么加载 fmodex.dll 的代码必须取决于 DLL 搜索路径中的当前目录,这可能会带来很大的安全风险(查找“DLL 种植”或 DLL“预加载”)并且被某些 Windows 配置主动阻止。

【讨论】:

  • 当前目录应该没问题(如果您指的是项目设置中的工作目录)。但是您可能就在那里,调试器似乎正在积极阻止程序从当前目录加载 DLL。我继续尝试一些比将 fmodex.dll 复制到我的本地 System32 文件夹更激烈的方法,并且该程序似乎启动得很好。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多