前些天把一个项目从XP 32位平台拿到Win7 64位平台去编译运行,用VS2008按Win32的方式编译连接都通过,但是一运行就报错,说是找不到msvcr90.dll,编译的DEBUG版本,也会调用msvcr90.dll?把项目中的每个工程配置中的“代码生成”中的“运行时库”由“多线程DLL(/MD)”设置成“多线程调试DLL(/MDd)”,一编译运行还是报同样的错。

    从VS2005开始,微软就将所有生成的应用程序都加上了一个清单文件(manifest),这个清单文件包含了运行此应用程序所需要的一些文件配置信息,如平台,版本等等,这个清单文件可以内嵌在应用程序中,也可以单独存在。在应用程序运行时就会根据这个清单文件去找相应的依赖文件,默认首先是查找系统目录下的WinSxS目录,如果找不到会在应用程序所在目录去查找。这个项目在XP下用VS2008是完全正常编译运行,但在Win7 X64下就出现了找不到动态库的问题。

    几经查找与试验,发现原来项目中的资源包含一个清单,这个清单只包含Common Controls的库文件comctl32.dll,项目在编译连接时会生成一个单独的清单文件,这个清单文件不包括Common Controls的库文件,我想应该是以项目资源形式存在的清单内嵌到应用程序中与非项目资源形式的清单发生冲突,导致在Win7下不能正常运行。把以项目资源形式存在的清单删除,编译运行,就正常了。我还尝试了删除后以内嵌和外置两种方式存在的清单,都正常。

    希望我的经历能帮助到遇到同样问题的网友。