2014年6月14日星期六

VS 2008编译的程序部署的一个问题解决

最近遇到一个问题,在一台机器上使用VS 2008编译的程序无法在其他机器上运行,马上想到了以前提到过的关于Side-by-Side问题, 但是安装了Microsoft Visual C++ 2008 SP1 Redistributable Package (x86)后程序还是无法运行,而且没有什么错误信息。然后使用Windows里的Computer Management里的Event Viewer的Windows Logs发现这个程序无法运行的原因在于其调用的一个动态链接库DLL。然后我查看了一下这个DLL的Manifest,原来多了一个Microshoft.VC90.DebugCRT的依赖,如下图所示。如果我们在机器上没有安装VS 2008当然就会没有Microshoft.VC90.DebugCRT的依赖需要的msvcm90d.dll,msvcp90d.dll,msvcr90d.dll,所以程序就无法运行了。

manifest_vs2008_debug
解决的方法就是使用在release模式下编译,或者如下图所示,修改C++ Project的Property里的Linker-->Debugging选项页,将Generate Debug Info修改成No,将Debuggable Assembly改成No Debuggable attribute emitted,原来如下图a所示,修改后如下图b所示:

debuggable_assembly_debug_modedebuggable_assembly_release_mode

现在再编译一次,查看一下新生成的DLL的Manifest可以发现Microshoft.VC90.DebugCRT的依赖已经没有了,现在程序应该可以在其他机器上运行了。

manifest_vs2008_release

没有评论: