关于MFC Release编译后,在其他电脑上无法打开的问题,side-by-side 错误

之前有个同事用MFC编写的程序发现很神奇的现象,就是编译后的程序,可以在他的电脑跟我们附近几个同事的电脑上运行,但是发给香港同事试用,他们竟然打不开,然后一团雾水,最后我帮他研究好久,终于发现问题,并解决。

在其他电脑上打开出现的错误,如下图
在这里插入图片描述
side-by-side configuration is incorrect…
很神奇,试了好多原因,比如系统不同啊,是否没有安装.net Framework版本太低,等等,都没分析出来。
最后发现他一个配置文件很奇怪,明明是Release发布,但是,他输出的exe旁边那个“.manifest”文件内容却显示了debug的内容,导致他实际调用的是debug的库,有些电脑上面没有那些库,就会导致出问题。该程序的输出配置文件名为“ CreateCertificate.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>

上面的name='Microsoft.VC90.DebugCRT’就是问题所在,然后我就查程序配置,发现导致这个问题出现的配置主要有三点:

  1. 请勿把Debug的宏COPY到 Release。尽量不要删除修改工程自带的宏。
    我同事将工程配置为Release编译时,错误的把debug的配置直接复制到Release中了,如下图
    在这里插入图片描述
    Release的配置中不应该存在DEBUG的宏配置。
    配置的路径为:项目属性=>C/C++=>Preprocessor=>Preprocessor Definitions

  2. 在Release的配置中,Runtime Library设置错误,同事设置成debug用到的库,Multi-threaded Debug DLL (/MDd),应该将它设置为Multi-threaded DLL (/MD)
    配置的路径为:项目属性=>C/C++=>Code Generation=>Runtime Library
    这个配置关联到那个“C:\Program Files\Microsoft Visual Studio 9.0\VC
    edist\x86\Microsoft.VC90.CRT”
    在这里插入图片描述
    在这里插入图片描述

  3. 还有就是代码里如果有宏定义 _DEBUG或者任何DEBUG相关的宏,记得Release时去掉,注释掉。

经过上面三个点处理后,Release编译输出的“ CreateCertificate.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.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>
</assembly>

前面的name='Microsoft.VC90.DebugCRT’变为name='Microsoft.VC90.MFC’

程序发给香港同事使用,终于可以正常运行。特此记录给大家参考,也给自己记录,以免后面忘记,又要摸索半死。

后记,又发现使用上面方法后,发布的软件,在一些新装WIN10系统上打不开,弹出side-by-side 错误。最后发现问题,他的系统上已经安装的环境都是X64的,解决方法,安装X86环境,安装完就可以打开。环境安装软件下载l链接,https://download.csdn.net/download/xjs38829890/85178058

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值