VC 2012 Release Build遇到启动错误
VC 2012 Release Build encounter startup error
我正在 VC 2012 年(VC 2012 (VC11) 作为我的编译器)构建一个纯 Win32 程序(没有 clr 或任何程序集)。它使用boost 1.58、wxWidget 3.0.2系列、gsl 1.8、jsoncpp、Open CV 2.4.10等...开发盒是运行ning Win7 64bits。我希望它是一个单一的可执行文件,并且能够 运行 在 Win 7 32/64 上,所以我在相同的 VC 2012 将上述所有包构建为库。(感谢 cmake )...
它在开发盒上工作正常,但在只安装了 VC 重新分发包的干净的机器上就不行了。我收到错误消息框,要求我使用 sxstrace,事件日志中的消息有如下并排错误,我也尝试了 sxstrace 并得到了类似的错误。
"D:\Release\xxxx.exe" 的启动内部产品失败。找不到依存组合 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32" ,version="9.0.21022.8"。请使用sxstrace.exe进行详细的诊断。
我一直在四处寻找。 All and answers 只是说我应该为所有库使用所有发布版本。是的,如果我不这样做,我一开始就无法拥有单个可执行文件。它无法 link。 (我是通过犯很多错误才学会的)我已经为我的程序尝试了 MD 或 MT 构建(不是将它们混合在一起。它们是分开测试的。)。任何一种模式都有效。同样的错误仍然存在。我还安装了很多 VC2008 9.0.21022, -.30729.17, -30729.4148, -30729.6161, VC 2010 10.0.40219, VC 2012 11.0.61030 (x86/x64)
我真的不明白。它是由 VC 2012 制作的纯 win32 版本构建。为什么它需要 VC90 调试 dll?
如果有人能给我更准确的建议,告诉我如何解决甚至确定我构建的代码或库哪里出了问题,出了什么问题,我将不胜感激。
我建议您使用以下工具:Dependency walker。
通过将您的可执行文件加载到您的 PC(它运行的地方),您应该找出它使用的所有 DLL,从而发现您的项目所依赖的(中型)库列表中的任何隐藏依赖项(以及它们的依赖项)依赖项)。
这应该可以帮助您指出您的 PC 上有但新安装的机器上没有的 DLL。
纯 Win32 发布版本不应依赖 DEBUG CRT dll,这是肯定的。唯一要控制的项目设置基本上是 MT/MD ("Runtime Library") 设置。你要MT.
我猜你在源代码的某处引用了 Debug CRT dll(例如,出于某种原因,其中一个库要求链接它,可能是因为有 #define DEBUG
或其他原因,因此覆盖项目设置。
您可以尝试在源代码中搜索#pragma comment(lib, ...bla-bla-bla...)
。
我自己解决了。该项目是关于迁移一个大的遗留项目。所以有一个非常小的没有源代码的VC90构建的lib。所以做一个细节人是做好这种工作的关键。
我正在 VC 2012 年(VC 2012 (VC11) 作为我的编译器)构建一个纯 Win32 程序(没有 clr 或任何程序集)。它使用boost 1.58、wxWidget 3.0.2系列、gsl 1.8、jsoncpp、Open CV 2.4.10等...开发盒是运行ning Win7 64bits。我希望它是一个单一的可执行文件,并且能够 运行 在 Win 7 32/64 上,所以我在相同的 VC 2012 将上述所有包构建为库。(感谢 cmake )...
它在开发盒上工作正常,但在只安装了 VC 重新分发包的干净的机器上就不行了。我收到错误消息框,要求我使用 sxstrace,事件日志中的消息有如下并排错误,我也尝试了 sxstrace 并得到了类似的错误。
"D:\Release\xxxx.exe" 的启动内部产品失败。找不到依存组合 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32" ,version="9.0.21022.8"。请使用sxstrace.exe进行详细的诊断。
我一直在四处寻找。 All and answers 只是说我应该为所有库使用所有发布版本。是的,如果我不这样做,我一开始就无法拥有单个可执行文件。它无法 link。 (我是通过犯很多错误才学会的)我已经为我的程序尝试了 MD 或 MT 构建(不是将它们混合在一起。它们是分开测试的。)。任何一种模式都有效。同样的错误仍然存在。我还安装了很多 VC2008 9.0.21022, -.30729.17, -30729.4148, -30729.6161, VC 2010 10.0.40219, VC 2012 11.0.61030 (x86/x64)
我真的不明白。它是由 VC 2012 制作的纯 win32 版本构建。为什么它需要 VC90 调试 dll?
如果有人能给我更准确的建议,告诉我如何解决甚至确定我构建的代码或库哪里出了问题,出了什么问题,我将不胜感激。
我建议您使用以下工具:Dependency walker。
通过将您的可执行文件加载到您的 PC(它运行的地方),您应该找出它使用的所有 DLL,从而发现您的项目所依赖的(中型)库列表中的任何隐藏依赖项(以及它们的依赖项)依赖项)。
这应该可以帮助您指出您的 PC 上有但新安装的机器上没有的 DLL。
纯 Win32 发布版本不应依赖 DEBUG CRT dll,这是肯定的。唯一要控制的项目设置基本上是 MT/MD ("Runtime Library") 设置。你要MT.
我猜你在源代码的某处引用了 Debug CRT dll(例如,出于某种原因,其中一个库要求链接它,可能是因为有 #define DEBUG
或其他原因,因此覆盖项目设置。
您可以尝试在源代码中搜索#pragma comment(lib, ...bla-bla-bla...)
。
我自己解决了。该项目是关于迁移一个大的遗留项目。所以有一个非常小的没有源代码的VC90构建的lib。所以做一个细节人是做好这种工作的关键。