vc2008编译的程序在其他电脑上无法运行的解决方案

FROM: http://blog.csdn.net/qianquanyiyan/article/details/6318809



在使用 VC++2008环境下生成的程序,放置到未安装VC环境的机器下后,有时候会出现程序无法执行的错误,其提示是:应用程序配置不正确,程序无法启动,重新安装应用程序可能解决问题。

      实际上,重装是解决不了问题的,解决的一种方法是查看*exe.intermediate.manifest文件,比如文件的内容是:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugMFC' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

       需要注意这个文件中的2个关键词:'Microsoft.VC90.DebugCRT' 'Microsoft.VC90.DebugMFC'寻找到...."Program Files"Microsoft Visual Studio 9"VC"redist文件夹下面,找到这些名称的子文件夹,拷贝它们下面所有的文件到希望发布的EXE文件下面,一起打包。这些文件也就是mfc90.dllmsvcr90.dllmsvcp90.dllMicrosoft.VC90.CRT.manifest等。此错误发生的原因是在目标机器上需要这些文件的支持。

转自:http://www.cnblogs.com/wuhanhoutao/archive/2008/01/09/1031928.html

说明:*exe.intermediate.manifest在你的中间目录下面,如果你没有改配置且生成Debug版本那么就在Debug目录下

'Microsoft.VC90.DebugCRT' 和'Microsoft.VC90.DebugMFC'文件夹在C:/Program Files/Microsoft Visual Studio 9.0/VC/redist/Debug_NonRedist/x86目录下 将上面两个目录下面的dll文件全部拷贝到你的exe文件下面即可。

我试了下这个是没问题的。

 

上面基本的意思是发布vc2005以上程序的时候要将你的运行时库一块发布出去。而你的工程依赖的运行时库可以从*exe.intermediate.manifest中找到

 

另一种解法:

vc2008确实好使,不过缺陷也非常明显,只要是它编译的东西,在其他电脑经常会出现无法顺利运行的情况,最常见的错误就是:“由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”

经过各种努力,最后发现,一般情况下只需要安装一下vcredist_x86.exe这个vc的可重发行组件包就可以了。其主要原理是因为 vc2008的版本比较高,其编译时链接的相关dll版本比xp下的高太多,而我们在xp下运行的时候调用的是老版本的dll,所以出现了问题。安装新版 的可重发行组件包后,旧版本的dll被替换成新版本的,问题就解决了。

可是又出现了新的问题,总不能让用户使用我们软件的时候,非要去安装其他组件吧~~而且,其他很多软件都是用vc开发的,这些软件为什么不需要呢?本着钻牛角尖的态度,进行了更深一步的探索;

最近研究ccv,突然发现ccv的bin目录下有一个Microsoft.VC90.CRT目录,下面有几个dll文件,还有一个manifast 文件。看到这个不禁眼前一亮,在我的程序中把这几个文件打包进去就ok了吧?于是进行尝试,查找本机安装vs2008目录下的 Microsoft.VC90.CRT目录一顿cp,结果,很沮丧,测试失败~~告一段落~~

某天又在网上发现有人在帖子里的回答,其中两个字吸引了我:“版本”。我灵机一动,赶紧去查看版本,发现我当前的版本是 9.0.30729.4148,而帖子里的manifast文件中的版本是9.0.21022.8。于是,我赶紧找了一个这个版本的下载下来,替换我的程 序中的这几个dll和manifast,再运行,果然成功了。

 

因此得到以下结论:

1、可重发行组件包是没问题的,肯定可以用,因为它替换了系统的这几个dll,所以可行;

2、如果不想在自己的“绿色”软件的基础上再要安装这么个组件,或者自己的非绿色软件在安装的过程中再安装这么个组件,只需要处理这几个关键的dll就行啦。

3、即使有了这几个dll也不一定行,一定要注意版本!实在不行这几个版本多试一试。我到现在还不太明白,我的vs2008的版本是9.0.30729.4148,编译出来的东西应该也是这个版本的啊,可是为什么用了老版本才好用,新版本的反而不好用呢?

4、具体文件如下:

Microsoft.VC90.CRT.manifest

msvcm90.dll

msvcp90.dll

msvcr90.dll

转自:http://hi.baidu.com/%BA%A3%BB%EA2000/blog/item/e4746b34a17cc7a5d1a2d326.html

 

个人经验:一般这个问题的产生是因为在工程配置中使用了Microsoft的的动态链接库,而在别人的系统上没有这些库或者是比较旧。解决的方法是 可以使用静态链接,比如你是用MFC的话就在工程/属性/gereral里面把"Use of MFC" 改成 "Use MFC in a Static Library"


你可能感兴趣的:(Manifest,实际应用)