C++ 如何确定哪个c++;重新发行我的程序需要运行吗?
是否可能需要为vs2012和vs2010安装vcredist 我刚刚遇到一个错误,我的应用程序无法加载.dll,在我进行了一次不相关的安装后,它突然开始工作,这促使我猜测它一定安装了一个较旧的vcredist,解决了这个问题。C++ 如何确定哪个c++;重新发行我的程序需要运行吗?,c++,visual-c++,C++,Visual C++,是否可能需要为vs2012和vs2010安装vcredist 我刚刚遇到一个错误,我的应用程序无法加载.dll,在我进行了一次不相关的安装后,它突然开始工作,这促使我猜测它一定安装了一个较旧的vcredist,解决了这个问题。 但是我确信我使用的是c++11特性。部署本身就是一项工作。我讨厌它,我讨厌你在Windows上写安装程序的方式…所以现在感觉好多了 您只需要一个vcredit。链接器决定将您的程序链接到的那个。如果安装了“Windows SDK”,您将在以下位置找到实际的redist:
但是我确信我使用的是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上)按如下方式解决了此问题:
dependency walker对我没有帮助(它只是报告了不必要的依赖项,这让我很困惑)。如果您想知道需要哪些运行时,可以尝试使用github()上lucasg提供的“依赖项”工具,该工具在win10等现代系统上工作 您只需在依赖关系树中查找
MsVcR####.dll
oVcRuntime###.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