C++ 如何确定哪个c++;重新发行我的程序需要运行吗?

C++ 如何确定哪个c++;重新发行我的程序需要运行吗?,c++,visual-c++,C++,Visual C++,是否可能需要为vs2012和vs2010安装vcredist 我刚刚遇到一个错误,我的应用程序无法加载.dll,在我进行了一次不相关的安装后,它突然开始工作,这促使我猜测它一定安装了一个较旧的vcredist,解决了这个问题。 但是我确信我使用的是c++11特性。部署本身就是一项工作。我讨厌它,我讨厌你在Windows上写安装程序的方式…所以现在感觉好多了 您只需要一个vcredit。链接器决定将您的程序链接到的那个。如果安装了“Windows SDK”,您将在以下位置找到实际的redist:

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

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

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

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

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86
如果您安装了所有更新,包括不重要的更新,Microsoft将更新该文件夹中的redist

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

msvcr100=VS 2010 redist

msvcr110=VS 2012 redist

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


PS:msvcr和msvcp始终至少有两个。如果您的操作系统是Vista或更高版本(不是XP),请使用内置的SxStrace.exe生成一个日志,记录正在加载的DLL以及需要它们的模块。它将清楚地显示您是否正在加载多个CRT DLL版本,以及DLL的类型(第三方或否)

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


--David

我(在Windows 7上)按如下方式解决了此问题:

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

  • dependency walker对我没有帮助(它只是报告了不必要的依赖项,这让我很困惑)。

    如果您想知道需要哪些运行时,可以尝试使用github()上lucasg提供的“依赖项”工具,该工具在win10等现代系统上工作

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


    PS:我们多年来一直使用的老而忠实的“依赖项步行器”似乎无法处理新操作系统处理延迟依赖项的方式,将它们标记为“缺失”,虽然它们没有缺失,但只是以一种它不知道的方式延迟加载…

    使用。Dependens只告诉我缺失110.dll。我知道,很奇怪。但是,如果你的程序依赖于另一个VisualStudio版本C++第三方LIBs构建的第三方库,那么这可能发生。嗯,我敢肯定我没有使用任何其他的C++ DLL,这个产品只是非常简单,但是我意识到“几乎”并不能减少它。我会调查的。但总的来说,我认为2012年的vcredist将包含旧版本vcredist的所有功能。这不是真的吗?我不久前用vs2010停止了Windows开发。所以我只能说“过去的日子”。2010 redist需要安装旧的2005 redist,因为它没有带来旧的msvc*.dll。也许微软改变了这一点,但我不这么认为,因为这会抵消redist的目标,只更新操作系统中必要的部分。难道程序不可能使用链接到msvcrt版本X的第三方DLL,并且程序(exe)本身链接到msvcrt版本Y吗?在这种情况下,要启动程序,你需要两个可再发行文件。Martin,首先你说一个程序只能链接一个,然后你说第三方dll可以同时拥有这两个文件。我不清楚为什么一方面只需要一个,但另一方面两者都需要存在。我在
    C:\Program Files(x86)\[etc..
    中也安装了几个SDK,但有两件事:第一,只有7.0A甚至有一个Bootstrapper\packages文件夹,第二,其中的vcredist只有一个vs2010 vcredist。所以这可能还不够,因为我使用的是c++11特性。很抱歉,让我澄清一下。如果您只有一个exe,并且与系统DLL以外的任何DLL都没有依赖关系,则只有一个msvcr