2023年12月29日发(作者:)

如何把VS2008上编的debug、release程序在没装VS的xp机器上运行

用VS2008 SP编写的MFC程序,拷贝到其他没装VS2008的机器上直接运行,肯定是不行的。即使选择静态链接MFC,有时候系统还是会提示“应用程序配置不正确”。这是因为程序中可能不止用到了9.0版本MFC,还可能有ATL、CRT、OPENMP等。在自己的机器上运行时,系统会到"C:WINDOWSWinSxS"文件夹查找相应的库,这个文件夹里包含了所有安装过的版本的运行库和清单文件。如果只找9.0版本的库和清单文件,也可以到"C:Program

FilesMicrosoft Visual Studio 9.0VCredistx86"这个文件夹。

对于只用到Release库程序:

拷贝需要的库和清单文件到exe所在目录,修改程序的清单文件,再移植就可以运行了。修改的方法是:用Release方式编译链接程序,然后修改st,将其中name为、等的dependency块删掉,生成(不是重新生成!)项目,VS会把清单文件重新嵌入到程序中。这样,到了目标机器上,系统就不会按照清单文件到WinSxS文件夹去查找库(当它找不到时,就会提示“配置错误”。从“事件查看器”中,会看到加载失败的信息),而是到了该加载时才从工作目录查找。网上很多说法都提到了拷贝dll和manifest,但如果不修改程序中嵌入的manifest的话,拷贝了也是没用的。

另外一个不需要修改清单文件的办法,是下载Microsoft Visual C++ 2008 Redistributable

Package,只有几兆,到目标机器上安装就可以了。这是vcredist_x86 for VS2008 的下载地址:

/downloads/?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en

这是vcredist_x86 for VS2008 SP1的下载地址:

/downloads/?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en

两个安装程序的版本略有差别。

当然,如果只用到了9.0版的MFC,只要选择“在静态库中使用MFC”,就可以运行了。

对于用到Debug库程序:

如果你的程序用到了Debug版的运行库,那么上述库是不能解决问题的,因为它们都是Release版。可以到"C:WINDOWSWinSxS",把用到的文件夹拷贝到目标机器的WinSxS中。不过我用的仍是修改清单文件的办法:从"C:Program FilesMicrosoft Visual Studio

9.0VCredistDebug_NonRedistx86"文件夹中,把用到的dll和MANIFEST拷贝到exe所在目录。用Release版编译链接程序(我的程序用到了OpenCV2.0的Debug库,而该库似乎用到了DebugCRT和DebugOpenMP。因此我的程序同时用到了Debug和Release的C Runtime),然后修改st,将其中的DebugCRT项目删掉,生成(不是重新生成!)项目,VS会把清单文件重新嵌入到程序中,完成!

还可以在“项目属性-清单工具-输入和输出”中将“嵌入清单”置为否,这样清单就不会被嵌入到exe中,而是被输出到了exe所在的文件夹。打开该清单文件,将Debug库删掉,最后将exe和清单文件一起拷贝到其他计算机。

另外,如果新建一个“安装项目”,在项目上点右键-添加-合并模块,似乎可以选择一些需要的库打包进安装文件中。安装时,这些被选上的库会被复制到WinSxS文件夹。一切看上去都没什么问题,唯一的问题是——我这样尝试后,发现仍是“初始化失败”

总结一下吧,想要移植一个程序,首先要知道这个程序依赖那些系统库,这一点可以查看它加载了哪些模块;其次要让程序知道,在新的计算机中,是到WinSxS文件夹寻找,还是到程序所在文件夹寻找,可以通过修改清单文件做到这一点。

我的方法:直接将

C:Program FilesMicrosoft Visual Studio 9.0VCredistDebug_NonRedistx86中的所需库文件拷到release下,生成的release版本(运用静态链接库)可以直接再任何机器上用,此做法原因是opencv调用了一些库文件,而并非自己的程序直接调用(本来就是静态调用)