最近开发的时候碰到一个心累的问题:由于使用到第三的SDK,而且该SDK有一定的历史,
在开发机上运行的时候,能够正常运行,但是部署到客户的设备时却报,无法正常运行程序
这种错误一般都是由于缺 msvcr**.dll msvcp**.dll,
这个时候一般直接安装对应的支持库即可,推荐一个比较全的
Microsoft Visual C++ Redistributable Package合集(2005~2010)
http://download.csdn.net/detail/inaqui/3995341
但是,安装完对应的支持库后,发现并不能解决问题
使用depends对程序的依赖项进行检查,提示以下ERROR
Error: The Side-by-Side configuration information for "c:\program files (x86)\common files\XXXX.DLL" contains errors. sxstrace.exe (14001).
一开始以为是x64和x32的支持库安装的有问题,卸载后,只安装x86版本的支持库,仍旧无法工作。
于是使用sxstrace.exe跟踪程序的运行,却发现该SDK下的不同dll竟然依赖不同版本的MSVCR90.dll MSVCP90.dll。
启动cmd控制台,设置日志地址
sxstrace.exe Trace -logfile:C:\MySxSTrace.log
在新的控制台中执行程序
提示错误后关闭即可
然后在原来运行sxstrace.exe的控制台中敲回车
并执行命令
sxstrace.exe Parse -logfile:C:\MySxSTrace.log -outfile:C:\MySxSTrace.txt
日志内容如下:
这是由于找不到9.0.30729.4148版本的msvcr90.dll等支持库,但是我确实已经把对应版本的支持库拷贝到当前目录和系统目录下,发现动态库不仅仅是拷贝到对应目录才能运行。
通过在观察日志,发现微软有个叫manifest的东西,来辅助完成对应的dll加载,在该日志中系统并没有从当前目录下去读取对应的dll,而是先去找manifest文件。
在c盘windows的winsxs文件夹下存了大量的manifest文件以及对应的msvc***.dll文件
在本次使用的sdk中只找到其中一个版本的支持库,需要再安装另一个支持库。
需要安装的支持库
通过搜索发现需要安装