VS2008版本发布的问题

来源:互联网 发布:塞班软件下载s60v3 编辑:程序博客网 时间:2024/06/13 04:45

MFC程序编译的程序在其他没有安装MFC运行库的电脑上是不能够直接运行的,在发布扫雷程序的时候就碰到了这种问题。在网上找了相关的资料介绍,像将所需要的动态链接文件全部拷到目标电脑的system32文件夹下,最后发现太多了,根本行不通。最后花了两天的是时间和好友研究了这个问题,最后终于解决,下面就以我发布的那个扫雷程序介绍一下我在发布扫雷程序中解决这个问题的具体方法,希望可以给解决类似问题的博友们一点帮助。

我编写的扫雷程序是MFC单文档,开发工具是VS2008(注:VS的其他版本没有验证,有兴趣的可以验证一下在VS的其他版本上运行是否可行)

我同时测了Debug和Realese两个版本。先在我的机器上编译生成了Debug版和Realese版,都打包发了过去。在他的电脑上发现Debug不能运行,提示无法运行,应用程序配置不正确。。。但是release版的exe可以启动的,调查后发现这是因为他的电脑上也安装了MFC的运行库,如果是在一台没有安装MFC运行库的电脑上同样无法运行。有运行库Debug版也不能运行,因为我的exe中嵌入了 manifest清单文件,我发现问题就出在这个文件上。

首先找到这个工程的系统目录中的Debug文件夹下的清单文件xxx.exe.embed.manifest这里的xxx是你的工程名,用记事本打开,内容如下:

<?xmlversion="1.0" encoding="UTF-8"standalone="yes"?>

<assemblyxmlns="urn:schemas-microsoft-com:asm.v1"manifestVersion="1.0">

  <trustInfoxmlns="urn:schemas-microsoft-com:asm.v3">

    <security>

      <requestedPrivileges>

        <requestedExecutionLevellevel="asInvoker"uiAccess="false"></requestedExecutionLevel>

      </requestedPrivileges>

    </security>

  </trustInfo>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32"name="Microsoft.VC90.DebugCRT" version="9.0.21022.8"processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type="win32"name="Microsoft.VC90.DebugMFC" version="9.0.21022.8"processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentitytype="win32" name="Microsoft.Windows.Common-Controls"version="6.0.0.0"processorArchitecture="x86"publicKeyToken="6595b64144ccf1df"language="*"></assemblyIdentity>

    </dependentAssembly>

  </dependency>

</assembly>

注意红色标记部分,Debug在他的电脑上不能运行原因也就更加明了了。在他的机器上有VS2008用户版的运行库,用户版的是没有debug版的运行库的,所以启动程序提示应用程序并行配置不正确,是因为找不到debug版的MFC和CRT

对于Realese版本,还是在这个工程目录中找到Realese文件夹,找到嵌入的清单文件xxx.exe.embed.manifest这里的xxx是你的工程名,用记事本打开,内容如下:

<?xmlversion='1.0' encoding='UTF-8' standalone='yes'?>

<assemblyxmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>

  <trustInfoxmlns="urn:schemas-microsoft-com:asm.v3">

    <security>

      <requestedPrivileges>

        <requestedExecutionLevellevel='asInvoker' uiAccess='false' />

      </requestedPrivileges>

    </security>

  </trustInfo>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type='win32'name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86'publicKeyToken='1fc8b3b9a1e18e3b'/>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type='win32'name='Microsoft.VC90.MFC' version='9.0.21022.8' processorArchitecture='x86'publicKeyToken='1fc8b3b9a1e18e3b'/>

    </dependentAssembly>

  </dependency>

  <dependency>

    <dependentAssembly>

      <assemblyIdentity type='win32'name='Microsoft.Windows.Common-Controls' version='6.0.0.0'processorArchitecture='x86' publicKeyToken='6595b64144ccf1df'language='*' />

    </dependentAssembly>

  </dependency>

</assembly>

同样注意红线部分,因为release版的manifest文件中描述的库版本是release版的库,所以release版可以运行。这样,只要删除 在嵌入的资源清单文件中添加CRT和MFC运行库的依赖项即可。在这个资源清单文件中删除这两个依赖项,通过下面的操作来解决这个问题:

将上面提到的两个嵌入的清单文件xxx.exe.embed.manifest都改为

<?xmlversion='1.0' encoding='UTF-8'standalone='yes'?>

<assemblyxmlns='urn:schemas-microsoft-com:asm.v1'manifestVersion='1.0'>

 <trustInfoxmlns="urn:schemas-microsoft-com:asm.v3">

    <security>

      <requestedPrivileges>

       <requestedExecutionLevellevel='asInvoker' uiAccess='false' />

      </requestedPrivileges>

    </security>

  </trustInfo>

  <dependency>

    <dependentAssembly>

      <assemblyIdentitytype='win32'name='Microsoft.Windows.Common-Controls' version='6.0.0.0'processorArchitecture='x86'publicKeyToken='6595b64144ccf1df'language='*' />

    </dependentAssembly>

  </dependency>

</assembly>

然后生成exe程序,debug或者release版本都行。

但是,在发布版本的时候还必须添加在资源清单文件中删除的那两个依赖项对应的dll文件,即

debug版的exe文件要与mfc90d.dllmsvcr90d.dll放在同一文件夹下;

release版的exe文件要与mfc90.dllmsvcr90.dll放在同一文件夹下。

(注:mfccrt库可能不只这两个,debug版本的库文件名称后面带个d,而release版本不带d,在别人机器上,程序如果执行时提示缺少xx.dll,那就到你的机器上找那个文件,拷贝去过) 

通过以上的方法在XP,Win7和Win8大多数机器都可以成功运行(我发布的是Realese),这一点已经验证。根据反馈,只有一台Win7的机器上出现了运行不了的情况,截图如下:


调查后发现这是因为VC运行库的版本不对,我下载了一个VC2008的运行库发过去,在那台电脑上安装后再打开,程序正常运行。VC运行库有不同的版本,需要安装和你要发布程序对应的VC运行库才能解决这个问题。这种情况针对Realese版本是有效的。

如果还是出现问题(暂时还没有得到反馈),会提示缺少一些dll文件,一般是mfc的动态链接库dll,和c++运行时库dll,每个版本的vs对应的mfc和c++运行库版本号不一样,然后根据用户的反馈,在自己的电脑上找到这几个文件,与exe放在同一个文件夹下,发到别人机器上运行。

通过以上步骤应该是可以解决问题,如果还是有问题,那就再找找其他的解决方案吧。一孔之见,希望上面介绍的方法能够对大家有所帮助。

0 0