【问题标题】:Release Application looking for MSVCR110d.dll发布寻找 MSVCR110d.dll 的应用程序
【发布时间】:2014-10-29 01:20:23
【问题描述】:

我已经用 Visual Studio 2012 构建了一个 c++ 应用程序。我试图让它在另一台没有安装 VS2012 的机器上运行,但它不会运行。它一直在寻找 msvcr110d.dll(不是 msvcr110.dll),我已经在发布模式下构建了应用程序,并且我为多线程 dll (/MD) 设置了运行时库(尽管我已经尝试了所有没有的选项有用)。我不知道为什么这没有运行。目标机器确实安装了可再发行组件。有什么建议吗?

【问题讨论】:

  • 你确定你已经在发布模式下完全重新构建了应用程序,并且发布模式配置没问题吗?
  • 是的,我已经重建了至少 5 次,并且尝试过清理和重建
  • 您的项目是否使用其他库?也许其他一些正在使用调试 DLL
  • 这是一个使用 freeglut 的 openGL 应用程序。不知道如何确定它是否正在使用调试 dll

标签: visual-studio-2012


【解决方案1】:

d.dll 后缀表示 C++ 运行时 DLL 的调试版本。这意味着您的 exe 是调试版本,需要 MSVCR110d.dll。

您应该部署您的 exe 的发布版本,这需要 MSVCR110.dll。

请用户安装VC2012 runtime redistributable,会安装MSVCR110.dll。

【讨论】:

  • 我正在构建发布,配置管理器解决方案配置设置为发布并且与项目相同
  • 您是否检查过是否即使在 Release 版本中也启用了调试信息?
  • 它已启用,我只是禁用它并重新构建,但仍然出现相同的错误
  • 你确定解决方案配置发布是指项目配置发布吗?
  • 不确定您的意思。它是我打开的唯一解决方案,当我转到构建>配置管理器时,我看到活动解决方案配置:发布。在项目部分下,项目配置也设置为发布。是这个意思吗?
【解决方案2】:

确保您制作的解决方案不仅是使用发布模式配置构建的,而且所有依赖项也使用非调试 DLL。正如您所写的那样,您正在使用导入的库(freeglut),所以也要检查它们。由于 freeglut 是开源的,您可能也想从头开始构建它(使用发布模式),而不是使用预构建的 DLL。

【讨论】:

  • 这是有道理的,不幸的是,我什至不知道如何开始构建 dll。这不是一个真正的问题,因为我不会分发这个应用程序,我只需要在一台机器上测试它。感谢您的帮助!
  • 这些信息对我来说已经足够了——谢谢!我有一个在调试模式下构建的 DLL,由于 msvcr110d.dll,它没有正确加载。我的 .exe 应用程序也处于调试模式,但问题仅出在 DLL 上(用 C++ 编码)。
【解决方案3】:

问题很可能是 freeglut 是一个调试库,而不是一个发布库,因此试图链接到调试模式 DLL。可能还存在 freeglut 的发布模式版本,您需要更改项目配置以使用该 freeglut 库。

但是,这里有一个更深层次的问题:如何确定这一点?如果有另一个库导致问题,或者如果它是您自己的可执行文件中的一些模糊设置怎么办?我发现工具Dependency Walker 非常有用。它的页面声称它包含在 Visual C++ 中,但我在任何 Visual C++ 安装中都找不到它(可能是因为我没有安装所有可选组件)。请注意,包含的帮助文件对我也不起作用,但您可以在网页上查看帮助文件的内容。

freeglut.dll 的依赖关系视图。我已经强调了这个版本的 FreeGLUT 使用的特定 C 运行时——你的可能不同。右侧的函数列表向您展示了 MSVCRT 导出的内容,突出显示的那些是似乎使用的函数。例如,看起来这个版本的 FreeGLUT 使用了 operator new。如果你的名字被打乱了,按 F10 取消 C++ 名字的修饰,看看函数是什么。所有丢失的 DLL 似乎都是“延迟加载”的 DLL(参见沙漏),因此它们可能不是问题。

我已经使用 Dependency Walker 解决了一些令人讨厌的 DLL 问题。虽然这对于您的特定问题来说可能有点矫枉过正,但我​​认为很高兴知道哪些工具可以让您真正看到问题,而不是仅仅推断问题就在那里。

【讨论】:

    【解决方案4】:

    快速简便的方法是将 msvcr110d.dll 从您的开发机器复制到目标机器。确保您使用的是与构建您的应用的体系结构(Windows\System32 或 Windows\SysWOW64)相对应的目录中的那个。

    【讨论】:

    • 只要是自己的机器就可以了,但是把调试运行时分发给别人就是违反许可的。
    • 国内部分SDK还是用VC++ 6.0 debug dll构建的。我该如何使用它?他们应该使用发布 dll 构建。
    【解决方案5】:

    即使您构建了 Release EXE 或 DLL 并尝试在没有 Visual Studio 2012 的机器上使用它们,您也需要安装 Visual C++ Redistributable for Visual Studio 2012。

    【讨论】:

    • 已安装在我的系统(x86 和 64)上,但无法在任何地方找到 dll。什么鬼?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多