起因

工程师发给用户一个VS编译的windows应用程序,客户反应打不开,报缺少dll。可是dll明明就在当前目录啊,为什么还会报错呢?

那应该是该DLL依赖的其它DLL不存在导致的,用depends软件打开看看依赖吧。不看不知道,一看吓一跳,缺的DLL还不少,MSVCP140D.DLL, VCRNTIME140D.DLL, UCRDBASED.DLL

那么怎么办?是不是从DLL下载的网站直接下载最新版本放到当前目录呢?

解决方法

解决问题以前先要搞清楚为什么会出现这个问题。

  • 工程师给客户的是DEBUG版本的DLL,通过depends软件也可以看到,缺少的MSVCP140D.DLL, VCRNTIME140D.DLL, UCRDBASED.DLL均为VS2015 runtime的debug版本,在你不安装VS完整环境的情况下,仅仅安装runtime也是不行的,因为runtime只有发布版本,即不带D后缀的DLL;

那么怎么办?有3个办法

1、装一个完整的VS,会很耗时间;

2、如果非要给debug版本的DLL,那么建议生成DLL的时候选择静态链接,对应不要选择多线程调试DLL类型,而是选择多线程调试MTD,这样对应依赖的DLL就会被包含在目标DLL中,也不需要安装runtime;

3、给用户release发布版本,同时安装VS runtime运行时,如果不想安装运行时,也要选择安装静态链接。