如何确定我的程序需要运行哪些c ++可再发行组件?

时间:2013-09-03 14:36:29

标签: c++ visual-c++

我是否可能需要为vs2012和vs2010安装vcredist?

我刚刚遇到一个错误,我的应用程序无法加载.dll,并且在我进行了无关的安装后突然开始工作,这促使我猜测它必须安装了一个修复问题的旧vcredist。 但是我确定我正在使用c ++ 11功能。

4 个答案:

答案 0 :(得分:13)

部署本身就是一项工作。我讨厌它,我讨厌你在Windows上编写安装的方式。 ......所以现在感觉好多了......

你只需要一个vcredist。链接器决定将您的程序链接到的那个。如果您安装了“Windows SDK”,您将在以下位置找到实际的redist:

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86

如果您安装所有更新,包括不重要的更新,Microsoft将更新该文件夹中的redist!

也许你有一个不想运行的可执行文件,你需要dependency walker。一个工具,非常有用,微软必须从Visual Studio中删除它。下载程序并在其中打开您的exe。你不需要了解真正发生的事情。只要在打开过程中没有出现Dialog,即使底部窗口中有感叹号,一切也都可以。如果对话框出现类似“无法解决”的内容而不是在底部窗口中查看。通常现在在较低的窗口中有类似的东西 “msvcr.dll”或“msvcr100.dll”或“msvcr110.dll”。 如果它在扩展名之前包含“d”,如“msvcr100d.dll”,则可执行文件在调试模式下编译,您的旅程将在没有安装编译器的系统上结束。如果没有,该名称告诉您需要哪个vcredist:

msvcr100 = VS 2010 redist (32bit) (64bit)

msvcr110 = VS 2012 redist (32/64bit?)

有时它不是msvcr,但总是以“ms”开头。当然程序会告诉你每个缺少的dll,不仅仅是微软和dll中的哪个命令被使用。这有时非常有用。 您必须对可执行文件夹中的每个dll执行此操作,因为它们也可能具有无法解析的依赖关系 回到你的第一个问题。您的程序只能链接到msvcr100或msvcr110,而不能同时链接到两者,这就是每个可执行文件只需要一个vcredist的原因。 如评论中所述,第三方DLL可能会使用不同的msvcp版本。所以,是的,你必须搜索你使用的所有DLL,你必须安装两个vcredist。

PS:总是至少有两个,msvcr和msvcp。

答案 1 :(得分:5)

我解决了这个问题如下(在Windows 7上):

  1. 我试图加载库,但显示“应用程序无法启动,因为它的并排信息不正确。”
  2. 我打开了“计算机管理”窗口:开始 - >右键单击Computer-> Manage。
  3. 在“计算机管理”窗口中,我选择了“事件查看器” - >“Windows日志” - >“应用程序”。
  4. 对应于该错误的日志表示未找到某个版本的Microsoft.VC90.CRT的DLL。在我的情况下,版本是9.0.30729.6161,在谷歌搜索它显示我需要安装here的“不寻常”版本的可再发行版本。
  5. 依赖性walker对我没有帮助(它只是通过报告不必要的依赖关系而使我感到困惑)。

答案 2 :(得分:2)

如果您的操作系统是Vista或更高版本(不是XP),请使用内置的SxStrace.exe生成正在加载DLL的日志以及需要它们的模块。它将清楚地显示是否正在加载多个CRT DLL版本,以及DLL(第三方或没有)。

将VS2012可再发行组件放入,例如“C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ redist”。

- 大卫

答案 3 :(得分:2)

如果您想知道需要哪些运行时,可以尝试使用" Dependencies"来自lucasg的工具github(https://github.com/lucasg/Dependencies),适用于像win10这样的现代系统。

您只需在依赖关系树中查找MsVcR##.dll o VcRuntime###.dll(其中#代表数字)。

HTH

PS:老忠实的依赖步行者"我们多年来一直在使用似乎无法处理较新的操作系统处理延迟依赖关系的方式,将它们标记为"缺少",虽然它们没有丢失,只是延迟加载它没有&# 39;知道......