Visual C++可执行文件和缺失的MSVCR100d.dll

38

我知道这个问题在其他地方已经被问过并回答了,但是我在使用MS Visual Studio 2010时遇到了问题。我开发了一个C++可执行文件,但如果我在没有VC++运行库(即msvcr100d.dll)的机器上运行Release版本,将会出现“程序无法启动,因为在您的计算机上找不到msvcr100d.dll”错误。

这很奇怪,有两个原因:

  • 为什么它要链接到可重定位库的调试版本?
  • 我尝试应用这个修复,将运行库设置为/MT而不是/MD(多线程DLL),但这只会使问题变得更糟(如果我手动复制msvcr100d.dll,则会提示找不到msvcp110.dll)。

我该如何打包运行库和我的可执行文件,以便在没有安装MS VC 2010或可重定位库的机器上运行它?

我知道在副本中包括DLL被认为是一种安全风险,因为它永远不会更新,但我的目标只是在短期内将这个可执行文件发送给几个朋友。


3
你所说的使用/MT设置会让情况变得更糟是什么意思?这应该是为了消除对DLL运行时的依赖关系。你的项目是否依赖于其他DLL文件?它们可能是错误地依赖于调试运行时的原因。类似Dependency Walker这样的工具可以帮助你确定是否存在这种情况:http://www.dependencywalker.com - Michael Burr
@eli:我认为人们在告诉你不要重新分发DLL时并不太关心安全风险,因为你可以静态链接。这更多是一个许可问题,而不是其他任何问题。 - user541686
2
依赖项 Walker 确认了我的项目依赖的 DLL 之一确实依赖于 msvcr100d.dll。原来该 DLL 在发布模式下没有构建。谢谢。 - mgiuffrida
正是因为这个问题,我把我的项目转移到了VS 2008上,而Win 7已经有了它的前置dll文件。 - Farrukh Waheed
6个回答

43

如果你使用“发布”模式编译,就绝对不需要调试版本的CRT。你可以通过它们的名称是否以d结尾来确定它们是否为DLL的调试版本。

更重要的是,调试版本是不可再分发的,因此将其与可执行文件捆绑或压缩这些DLL并不简单。

确保你将应用程序的所有组件都编译为“发布”模式,并链接正确版本的CRT和任何其他库(例如MFC, ATL等)。

当然,如果没有安装,你需要msvcr100.dll(注意没有d后缀)和一些其他文件。让你的朋友下载Visual C++ 2010 Redistributable(或x64),或者通过构建安装程序自动包含它们到你的应用程序中。


安装 Microsoft Visual C++ 2010 SP1 可再发行组件包(x86)对我来说非常有效! - Joseph
@Joseph,这只适用于发布版本,因为(正如Cody Gray所提到的)调试版本通常不可再分发。如果您没有安装MSVC2010,则msvcr100d.dll仍将缺失。 - andreee
这些链接已经失效了 :-/ - Ignorante
谷歌搜索名字@Ignorante,很容易就能找到他们。 - Cody Gray
谷歌搜索名字为@Ignorante的人很容易找到。这是一件微不足道的事情。 - Cody Gray - on strike
我找到了它们,但不是在微软网站上。显然他们在那里不再提供这些资源。这就是我发表评论的原因。 - Ignorante

2
这个问题在MSDN Library中有解释,我理解安装Microsoft的Redistributable Package可以解决问题。
但是有时候可以使用以下解决方案(作为开发人员的解决方案):
在Visual Studio中,打开项目属性 -> 配置属性 -> C/C++ -> 代码生成并将选项运行库更改为/MT而不是/MD

2

对于我来说,出现问题的情况是这样的:

我安装了VS2012,不再需要VS2010。 我想让我的电脑干净一些,并删除了VS2010运行时可执行文件,认为没有其他程序会使用它。 然后我想通过将DLL附加到程序(我们称之为程序X)来测试它。 我收到了同样的错误消息。 我以为在编译DLL时做错了什么。 然而,真正的问题是我将DLL附加到了程序X中,而程序X是在带有调试信息的VS2010中编译的。这就是为什么会出现错误。 我在VS2012中重新编译了程序X,错误消失了。


1
通常缺少.dll文件的应用程序会指示您需要哪个版本-如果一个不起作用,只需从此链接下载Microsoft Visual C++ 2010 x86或x64即可。
32位操作系统:这里 64位操作系统:这里

1

vc++库的调试版本dll不适合再分发!

应用程序的调试版本不可再分发,Visual C++库的调试版本DLL也不可再分发。您只能将调试版本的应用程序和Visual C++ DLL部署到其他计算机上,仅用于在未安装Visual Studio的计算机上进行调试和测试应用程序。有关更多信息,请参阅“重新分发Visual C++文件”。

我也会提供链接:http://msdn.microsoft.com/en-us/library/aa985618.aspx


1

我遇到了相同的错误。

我在一个VS2012项目中引用了一个VS2010 DLL。

只需要在VS2012上重新编译DLL,现在一切正常。


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