我已经用 Visual Studio 2012 构建了一个 c++ 应用程序。我试图让它在另一台没有安装 VS2012 的机器上运行,但它不会运行。它一直在寻找 msvcr110d.dll(不是 msvcr110.dll),我已经在发布模式下构建了应用程序,并且我为多线程 dll (/MD) 设置了运行时库(尽管我已经尝试了所有没有的选项有用)。我不知道为什么这没有运行。目标机器确实安装了可再发行组件。有什么建议么?
5 回答
后缀表示 C++ 运行时 DLL的d.dll
调试版本。这意味着您的 exe 是调试版本,它需要MSVCR110d.dll
.
您应该部署您的 exe 的发布版本,这需要MSVCR110.dll
.
要求用户安装VC2012 runtime redistributable,MSVCR110.dll
将被安装。
确保不仅您正在制作的解决方案是使用发布模式配置构建的,而且所有依赖项也都使用非调试 DLL。正如您所写的那样,您正在使用导入的库(freeglut),所以也要检查它们。由于 freeglut 是开源的,您可能也想从头开始构建它(使用发布模式),而不是使用预构建的 DLL。
问题很可能是 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 问题。虽然对于您的特定问题来说这可能是矫枉过正,但我认为很高兴知道哪些工具可以让您真正看到问题,而不是仅仅推断它就在那里。
快速简便的方法是将 msvcr110d.dll 从您的开发机器复制到目标机器。确保您使用的是与构建应用程序的体系结构相对应的目录中的一个(Windows\System32 或 Windows\SysWOW64)。
即使您构建了 Release EXE 或 DLL 并尝试在没有 Visual Studio 2012 的机器上使用它们, 您也需要安装Visual C++ Redistributable for Visual Studio 2012。