之前有个同事用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’就是问题所在,然后我就查程序配置,发现导致这个问题出现的配置主要有三点:
-
请勿把Debug的宏COPY到 Release。尽量不要删除修改工程自带的宏。
我同事将工程配置为Release编译时,错误的把debug的配置直接复制到Release中了,如下图
Release的配置中不应该存在DEBUG的宏配置。
配置的路径为:项目属性=>C/C++=>Preprocessor=>Preprocessor Definitions -
在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”
-
还有就是代码里如果有宏定义 _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