在将程序一直到VS2005之后,又不出现了一些问题,比如兼容性问题,好在这个问题网上有很多人都遇到过,所以不难解决。
然而在我将程序打包发到别人机子上,又出现了无法运行的错误,错误为“VC2005程序的一个运行错误 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。”。
由于上篇博文已经介绍了这个类似的错误,我也是有了一点经验,网上一搜,结果发现这个问题出现的次数并不少。
网上比较通用的做法是
在类似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:
msvcm80d.dll
,msvcp80d.dll
,Microsoft.VC80.DebugCRT.manifest
,msvcr80d.dll,
把这几个文件拷贝到目标机器上,
这个问题是由于编译选项为/MD的程序需要动态加载dll,也就包括了一些运行时库,当找不到的时候就报上述错误。
而我这么照做之后发现并不行,所以只好自己一边资料,一边排错(事件查看器+depends walker),找了一下午,基本上明确了怎么错的。
原因在于恶心的manifest。。。记住以后这种问题一定看看自己引用的dll的manifest依赖的运行库的版本
以下是我的总结:
这个点目前看来是由于/MD的程序需要动态加载dll,而干净机器上没有DLL导致的,另外manifest文件的信息也会影响程序的运行,必须版本匹配,真正原因在于这个版本的libclamavd.dll的manifest要求的Microsoft.VC80.DebugCRT.manifest版本为version="8.0.50608.0",该版本使用于xp,而按照网上做法我拷贝到exe目录的Microsoft.VC80.DebugCRT.manifest版本为version="8.0.50727.762",该版本使用于vista,所以导致无法识别,进而程序无法启动。
解决办法:(1)将程序按照release版本编译,设置configurate properties中code genaration为/MTd,同时设置configurate properties中的general中的use MFC为Use MFC in a Static Library,同时在linker中设置Linker->Input->Additional Dependencies 加上 nafxcw.lib libcpmt.lib,Linker->Input->Ignore Specific Library 加入 nafxcw.lib libcpmt.lib (这一条网上有解释)。
(2)将Microsoft.VC80.DebugCRT.manifest版本及其下属的msvcr80d.dll,msvcp80d.dll,msvcm80d.dll三个文件拷贝到exe文件所在目录。