昨天帮人装一个上古工业软件,点启动直接报错,说找不到这个 mfc42d 开头的 DLL,问题出在那个文件名最后的字母 d,它是 debug 版的库,正式机器上压根没有。
mfc42 是微软 MFC 库的老版本,数字 42 对应 Visual C++ 六点零那一代,九十年代末到 2000 年初的软件最爱用它。d 结尾的是调试版,发布版的是 mfc42.dll,两个名字只差一个字母,但不能混装。正式发布的软件本应该带着发布版库走,可很多小厂直接把开发机上的 debug 目录扔过来,一跑就缺这个文件。
这三个修复方向从稳到险排列
最稳的是找软件厂商要正式版安装包,debug 版库本来就不该出现在客户机器上,装了正式包问题自然没。退一步的做法是让开发生成 release 版本再重新部署,这也是正规路子。
网上随便搜个同名 DLL 塞进 system32 是最不建议的做法。下载来的文件版本不对、32 位和 64 位混装,轻则报错,重则中毒。哪怕真要放,也要放进软件自己的目录下,别往系统目录里塞,免得污染别人的运行环境。
- 先看报错弹几次:只缺这一个就查软件的发布包是否给全了
- 多个 DLL 连环缺:说明运行库整套没装好,装对应版本的 VC 运行库
- 老软件跑新系统:右键兼容性选 WinXP 模式,再以管理员身份跑
64 位系统还有个细节,32 位程序加载的 system32 其实被重定向到了 SysWOW64,文件放错地方同样报错,所以别靠猜路径,先确认软件是 32 位还是 64 位。
顺带说说同类文件,缺 msvcp 加数字开头的、缺 vcruntime 结尾的,都是 VC 运行库那一挂,跟这个 mfc42d 是一家人。判断方法一样,看名字前缀定年代,看结尾字母定是不是调试版。成套缺的时候别一个个下载,直接装对应年份的运行库合包,一次到位更省事。
还有个环境相关的现象,软件在开发机上好好的,一到客户机就报缺这个文件,多半是打包时把调试目录一起带上了。让开发出一份干净的发布包,只带发布版库,这个报错会自己消失,比在客户机上到处补文件根本。
一句话:缺 debug 版库说明软件打包有问题,先找厂商要正式包,网上下载是最后的选择,能不用就不用。