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