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

visual How do I determine which c++ redistributables my program needs to run?

本文关键字:c++ 文件 再发行 运行 何确定 我的 程序 visual      更新时间:2023-10-16

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

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

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

你只需要一个vcredist。链接器决定将你的程序链接到的。如果你安装了"Windows SDK",你会在中找到实际的redist

C:Program FilesMicrosoft SDKsWindowsv7.0ABootstrapperPackagesvcredist_x86

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

也许你有一个不想运行的可执行文件,你需要依赖助行器。这是一个非常有用的工具,以至于微软不得不将其从Visual Studio中删除。下载程序并在其中打开你的exe。你不需要了解真正发生了什么。只要在打开过程中没有出现对话框,即使底部窗口中有感叹号,一切都可以。如果对话框出现类似"无法解决"的内容,请查看底部窗口。通常在下面的窗户里有这样的东西"msvcr.dll"、"msvcr100.dll"或"msvcr110.dll"。如果它在扩展名(如"msvcr100d.dll")之前包含一个"d",则可执行文件是在调试模式下编译的,您的旅程将在没有安装编译器的系统上结束。如果没有,名称会告诉你需要哪个vcredist:

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

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

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

附言:它们总是至少有两个,msvcr和msvcp。

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

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

HTH-

附言:我们多年来一直使用的古老而忠实的"依赖性助行器"似乎无法处理较新操作系统处理延迟依赖性的方式,将其标记为"丢失",虽然它们没有丢失,但只是以一种它不知道的方式延迟加载。。。

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

  1. 我试图加载库,但它失败了,显示"应用程序无法启动,因为它的并排信息不正确。"
  2. 我打开了"计算机管理"窗口:开始->右键单击计算机->管理
  3. 在"计算机管理"窗口中,我选择了"事件查看器"->"Windows日志"->"应用程序"
  4. 与错误相对应的日志显示,找不到特定版本Microsoft.VC90.CRT的DLL。在我的案例中,版本是9.0.30729.6161,在谷歌上搜索发现我需要从这里安装一个"不寻常"的可再发行版本

依赖性助行器对我没有帮助(它只是报告了不必要的依赖性,让我感到困惑)。

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

VS2012可再发行文件被放入,例如"C:\Program Files(x86)\Microsoft Visual Studio 11.0\VC\redist"。

--David