简介:程序启动时提示缺少MSVCP120D.dll、MSVCR120D.dll,通常不是简单复制文件就能解决。本文从运行时库版本、Debug/Release混用、附加依赖项配置和编译环境一致性等角度分析问题成因,并提供可落地的排查与修复步骤,帮助开发者避免因动态链接库缺失导致的启动失败。
在Windows环境下运行某些程序时,可能会弹出类似下面的错误提示:
无法启动此程序,因为计算机中丢失 MSVCP120D.dll。无法启动此程序,因为计算机中丢失 MSVCR120D.dll。
很多开发者第一反应是把这两个文件复制到系统目录,例如:
C:\Windows\System32
但实际测试中,即使复制过去,程序仍然可能无法运行,或者出现新的错误,例如:
应用程序无法正常启动 0xc000007b
这说明问题并非单纯“缺少DLL文件”,而是运行时环境与程序编译配置之间存在更深层的不匹配。
MSVCP120D.dll和MSVCR120D.dll属于Microsoft Visual C++运行库的一部分。文件名中的关键信息如下:
因此,这两个文件不是系统自带的基础DLL,而是Visual C++ 2013调试版运行库组件。它们通常不会随普通用户环境自动安装,只有在安装了对应版本的Visual Studio或调试运行库后才会存在。
一个常见误解是把“120”直接对应为Visual Studio 2010。实际上,不同工具集版本号大致对应关系如下:
Visual Studio 2010 -> 100Visual Studio 2012 -> 110Visual Studio 2013 -> 120Visual Studio 2015 -> 140Visual Studio 2017 -> 141
所以,MSVCP120D.dll更准确地对应Visual Studio 2013的调试运行库,而不是2010版本。
出现这类缺失提示,通常可以归结为以下几种原因。
如果程序是在Debug模式下编译的,它默认会链接调试版运行库,即MSVCP120D.dll和MSVCR120D.dll。这类DLL通常只存在于开发环境中。把Debug程序直接拷贝到其他电脑运行时,就可能因为缺少调试运行库而报错。
解决方案通常是把程序改为Release模式重新编译。Release版本链接的是非调试运行库,例如MSVCP120.dll和MSVCR120.dll,这些文件可以通过安装Visual C++ 2013运行库获得。
在某些项目中,开发者可能手动设置了附加依赖项,例如:
opencv_core2411d.libopencv_highgui2411d.lib
留意库名最后的字母“d”,这通常表示该库是Debug版本。如果当前项目配置为Release,却链接了带“d”的库,就可能引入调试运行库依赖,从而在启动时请求MSVCP120D.dll和MSVCR120D.dll。
这种情况在第三方库使用中非常常见。例如,使用OpenCV时,Debug配置应链接带“d”的库,Release配置应链接不带“d”的库。一旦混用,就会出现运行库不匹配。
如果项目使用Visual Studio 2017开发,但链接的第三方库是由Visual Studio 2013编译的,就可能出现工具集版本不一致的问题。
例如,开发者当前环境为Visual Studio 2017,但使用的OpenCV库版本为v12,也就是由Visual Studio 2013编译。此时,即使项目本身使用v141工具集,只要附加依赖项中引用了v120生成的库,程序运行时仍可能加载v120对应的调试运行库。
在这种情况下,单纯复制DLL并不能解决根本问题。因为除了运行库外,不同工具集生成的库在ABI、标准库实现细节等方面也可能存在差异,容易引发更深层的崩溃或未定义行为。
部分程序在运行时通过环境变量查找DLL。例如,当多个版本的运行库同时存在,系统加载了错误版本,也可能出现启动失败。此时需要检查应用目录下是否放置了不匹配的DLL,或者PATH环境变量中是否存在冲突路径。
面对MSVCP120D.dll和MSVCR120D.dll缺失问题,可以按照以下顺序排查。
查看当前生成的可执行文件是Debug版本还是Release版本。
打开项目属性,进入:
链接器 -> 输入 -> 附加依赖项
确认当前配置下使用的库文件名是否与配置匹配。
Debug配置通常链接:
xxxd.lib
Release配置通常链接:
xxx.lib
如果Release配置下混入带“d”的库,应替换为对应Release版本。
确认第三方库是由哪个工具集版本编译的。如果当前项目使用Visual Studio 2017,应优先选择v141版本的预编译库;如果使用Visual Studio 2015,则选择v140版本。
避免将v120库直接链接到v141项目中,除非能确认源码级兼容性,并且已经处理了运行库依赖问题。
查看可执行文件所在目录是否手动放置了MSVCP120D.dll或MSVCR120D.dll。如果放置了错误版本,建议移除后重新测试。
同时检查PATH环境变量中是否存在多个版本的Visual C++运行库路径,避免系统加载错误DLL。
根据实际场景,可以选择以下方案。
如果必须在开发环境中运行Debug程序,可以安装Visual Studio 2013的调试运行库。一般通过安装对应版本的Visual Studio即可获得这些DLL。
对于需要分发的程序,推荐使用Release模式生成可执行文件,并链接Release版第三方库。这样运行时只需安装对应的Visual C++运行库即可。
尽量保持编译器工具集与第三方库版本一致。例如,全部使用v140或全部使用v141,避免跨版本混用。
如果现有预编译库与当前编译器不兼容,可以考虑基于当前工具集从源码重新编译这些库。这样可以从源头上消除运行库版本冲突。
MSVCP120D.dll和MSVCR120D.dll缺失问题的本质,是程序对Visual C++ 2013调试运行库存在依赖,而目标环境中没有对应的运行库。简单复制DLL文件通常无法彻底解决,甚至可能引发新的错误。
正确处理方式应包括:
排查此类问题时,应从构建配置、运行库类型和依赖库版本三个维度综合考虑,而不是只关注缺失的DLL文件名。这样才能避免反复复制文件却始终无法启动的困境。