使用Visual Studio开发应用程序时,为了临时在非开发机上看一下效果,就直接把Debug下的文件全部拷贝到该机器上,直接双击exe运行。双击之后,没有直接打开应用程序,而是弹出了一个Error弹框。
赶快在网上搜了一遍,发现大部分是说让修改代码生成中运行库的MDd修改为MTd。
这里需要说明一点,如果把MDd修改为MTd,那如果有多个动态库,且这几个动态库被exe直接引用,那对于内存释放,需要在动态库内生成和释放,否则会出现堆错误。主要的原因是当多项目以MD方式运作时,其内部会采用同一个堆,否则是多个堆,内存需要分别管理。
现手上开发的项目就是多个DLL并采用MDd方式的,修改为MTd是不现实的。
在搜索中,逐渐发现真实的原因是由于缺少运行库。在开发机上,vs自动引用了相关的运行库,所以可以正常运行EXE。找到原因之后,那接下来就要去找所缺的运行库。面对该错误弹框,并不知缺少哪些运行库,如何才能找到缺少的运行库。通过搜索,找到了dependency walker这块软件,在MSDN上也有推荐。動態連結程式庫 (DLL) - Windows Client | Microsoft Learn。
在非开发机上下载该软件的最新版本,然后以管理员权限打开该软件,在该软件内打开exe或dll文件,这时就开始分析所缺少的文件。分析完成之后,会出现以下界面。
这里标红的地方就是缺少的运行库,然后右键,在弹出菜单中选择全路径(full path)。
得到该运行库所在的目录路径,到该路径下复制相关运行,并拷贝到exe的同级目录。
找到所有缺少的库,都拷贝到exe的同级目录,然后点击EXE就可以正常运行了。