Visual Studio 2019 新建控制台项目,直接编译通过,放到其它电脑上(没有安装VS环境),无法运行,报如下错误:
丢失VCRUNTIME140D.dll
解决方案:
在VS工程项目中,设置 属性—>配置属性—>C/C++ —>代码生成—>运行库,Release 选择 多线程(/MT), Debug 选择 多线程调试 (/MTd),如图所示
编译Release 版本,此时如果工程没有依赖其它静态库,一般都能在其它电脑运行。
但是,如果工程中依赖了其它静态库,编译的时候警告 “LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library”,但能编译成功,如下图所示:
看着只是警告,但在其它电脑上依然报错:丢失VCRUNTIME140D.dll,根据提示,设置 属性—>配置属性—>链接器 —>输入—>忽略特定默认库, 填上 LIBCMT.lib(如下图所示),编译时上面的警告消失了,但在其它电脑上依然报错:丢失VCRUNTIME140D.dll,在网上找了一圈,没有任何有用的信息,都是设置多线程(/MT),或者把缺少的dll放在程序同一目录下一起发布(有时确实可以解决上述问题)。我也尝试把依赖的静态库重新编译了一遍,依然无法解决上面的问题。
【终极解决方案】
编译时警告 “LIBCMT”与其他库的使用冲突,这是关键点,那它与什么库冲突呢,答案是:MSVCRTD.lib,而LIBCMT.lib 是我们需要的,那我们换成忽略特定默认库MSVCRTD.lib(如下图所示),编译通过并在其它电脑运行成功。注意这个问题在新版的VS才发现的,旧的VS没有这一问题。
MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库
MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库
MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dll
MDd: MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll