![a5c9d499e740ba05f92debf91ec6dbf9.gif](https://img-blog.csdnimg.cn/img_convert/a5c9d499e740ba05f92debf91ec6dbf9.gif)
点击上方蓝字关注我!
最近指导本科生实习时遇到一个问题:他写的程序在自己的机器上可以正常运行,但是拷贝到同学的机器上会报告加载失败,如下图所示。
图1 程序加载失败
象这种问题,基本上都是由于程序依赖某个DLL,而在出错的电脑上没有这个DLL。怎么知道是哪个DLL不存在呢?如果百度一下,很多人会提到Dependency Walker这个工具。Dependency Walker是一个非常好用工具,它可以分析一个EXE或DLL文件都依赖哪些DLL。Dependency Walker曾经是早期Visual Studio标配的工具,不过后来被从VS中删除了。他的作者专门建了一个网站(http://www.dependencywalker.com/)来提供免费的版本供大家下载。不过我不推荐大家去下载这个工具,因为它古老了,2006年以后就没有更新过,在我的Win10系统中一打开EXE就会死机。我推荐大家使用另一个工具Dependencies(https://github.com/lucasg/Dependencies)。这个开源软件是另外一个作者用C#语言重新写的,并做了一些功能上的增强。
下载Dependencies之后,运行DependenciesGUI.exe,然后就可以打开EXE或DLL文件进行分析了。在图2中,我们可以看到,它会列出我们的程序都依赖哪些DLL,包括系统提供的(如user32、gdi32),也包括Visual C++自身需要的DLL(图中的最后两个)。
图2 使用Dependencies进行分析
之所以在其他同学的机器上无法加载,问题就出现在最后的两个DLL上。这两个DLL的文件名(不包括扩展名)都是以字母d结尾的。这说明这两个DLL都是Debug版本的。Visual C++将编译生成的程序分为Release和Debug版本,前者是最终发布给用户的版本,而后者是开发人员进行调试的版本。两个版本依赖的DLL也不同,比如Release版本依赖VCRUNTIME140.DLL,而Debug版本依赖VCRUNTIME140D.DLL。Windows会带有最新的VC++运行版本库,所以如果生成Release版本,通常直接将EXE文件拷贝到其他人的机器上就可以运行(如果其他用户的操作系统太老,可能还是需要拷贝运行库的)。而Debug版本的运行库只有安装了VS的用户机器上才会有,所以如果拷贝Debug版本EXE文件到其他人的机器上就可能无法运行了。
要把Debug模式切换到Release模式很简单只要在图3所标出的地方选择Release即可。这样再编译出来的程序就很容易分发到其他电脑上了。
图3 在配置管理器部分改变编译配置
这个问题看似是一个小问题,但是基本上每个VC++的程序员都会至少犯一次。 公众号近期内容回顾学术交流开放日:WebRTC简介
闲谈清华自动化系C++大作业“雷课堂”
实习招聘:表情管理软件开发
使用Excel分析乐学/Moodle平台的日志
大作业《智能梳妆台》精选:男生版
大作业《智能梳妆台》精选:男生版
熊康华:《代码整洁之道》读后感
王宇航:《代码简洁之道》读后感
刘美辰之《Clean Code》读后感
窦博文:《代码整洁之道》读书感言
张亚磊同学《代码整洁之道》的阅读笔记
管宇同同学分享《代码整洁之道》读书心得
病毒不能阻止我学习 | 居家下载论文指南
盘点2019,过得很充实
![bca1ea51b2954d4c244ad7685309a566.png](https://img-blog.csdnimg.cn/img_convert/bca1ea51b2954d4c244ad7685309a566.png)
![9aa6c0b0157cf24c2e83598834048170.png](https://img-blog.csdnimg.cn/img_convert/9aa6c0b0157cf24c2e83598834048170.png)
![0d4487f58b14308366fc73b34829962d.png](https://img-blog.csdnimg.cn/img_convert/0d4487f58b14308366fc73b34829962d.png)
点击在看,为作者点赞