MSVCP120d.dll丢失

43

5
只部署程序的发布版本,永远不要部署调试版本。 - Hans Passant
3
MSVCP120是针对VS2013的。VS2012应该寻找MSVCP110。这是一个2012还是2013系统? - cup
1
@drescherjm 我正在使用来自vc12文件夹的opencv dlls,因此我猜它们是使用VS2012构建的。 - MazzMan
3
我将根据文件来验证,具体使用哪个取决于文件。同时,vc12也可能意味着Visual Studio 2013。两位数字的编译器版本不一定与年份相对应。虽然在2010年时有这种情况,但通常并非如此。这也是为什么msvcpXXX中的数字与年份不匹配的原因。 - drescherjm
2
@drescherjm 哦,谢谢!我将vc12更改为vc11。现在一切都完美运作 :) - MazzMan
显示剩余8条评论
8个回答

62

根据评论,问题是由于在使用Visual Studio 2012编译的项目中使用了使用Visual Studio 2013构建的dlls引起的。造成这种情况的原因是第三方库命名了包含dlls的文件夹为vc11、vc12等。任何使用编译器版本(小于4位数字)的系统都必须小心使用,因为这与Visual Studio的版本不匹配(除了Visual Studio 2010)。

  • vc8 = Visual Studio 2005
  • vc9 = Visual Studio 2008
  • vc10 = Visual Studio 2010
  • vc11 = Visual Studio 2012
  • vc12 = Visual Studio 2013
  • vc14 = Visual Studio 2015
  • vc15 = Visual Studio 2017
  • vc16 = Visual Studio 2019

Microsoft C++运行时dlls也使用基于编译器版本而非Visual Studio版本的2或3位代码。

  • MSVCP80.DLL来自Visual Studio 2005
  • MSVCP90.DLL来自Visual Studio 2008
  • MSVCP100.DLL来自Visual Studio 2010
  • MSVCP110.DLL来自Visual Studio 2012
  • MSVCP120.DLL来自Visual Studio 2013
  • MSVCP140.DLL来自Visual Studio 2015、2017和2019

在Visual Studio 2015、2017和2019之间存在二进制兼容性。


所有VC++可再发行组件都在一个地方:https://support.microsoft.com/en-us/kb/2977003 - 警告:它们使用相同的文件名,没有版本标识符(只有vcredist_x86.exe等)。 - George Birbilis
1
如果我们正在使用VS 2017呢? - Sndn

52

我曾经浪费很多时间在这个问题上寻找解决方案,而且我也怀疑以后还会遇到类似的情况。所以这里给自己和其他可能有用的人做个记录。

如果提示缺少 MSVCP120.DLL,则说明你没有安装 Visual Studio 2013(x86 和 x64)的 Visual C++ Redistributable Packages。安装它,重新启动计算机,然后你应该能在 c:\Windows\System32 目录下找到这个文件。

如果提示缺少 MSVCP120D.DLL,则说明你试图运行的应用程序是在 Debug 模式下编译的。正如 OP 所提到的,运行时的调试版本是不能分发的。

那么,我们该怎么办呢?

嗯,我知道有一个选项:进入你的项目的 Debug 配置 > C/C++ > Code Generation > Runtime Library,选择 Multi-threaded Debug (/MTd)。这将把 MSVCP120D.dll 静态链接到你的可执行文件中。

如果你只想快速解决问题,也有一个快速方法:从 sys32 文件夹(我的是 C:\Windows\System32)中复制 MSVCP120D.DLL。你可能还需要 MSVCR120D.DLL。

关于快速修复的补充:为了减少猜测,你可以使用 dependency walker。用 dependency walker 打开你的应用程序,你会看到哪些 dll 文件是需要的。

例如,我的最近一个应用程序是在 Visual Studio 2015(Windows 10 64 位机器)中构建的,我打算将其针对 32 位 Windows XP 机器。使用 dependency walker,我的应用程序(见截图)需要以下文件:

  • opencv_*.dll <-- 我自己的 dll 文件(可能还有依赖关系)
  • msvcp140d.dll <-- SysWOW64\msvcp140d.dll
  • kernel32.dll <-- SysWOW64\kernel32.dll
  • vcruntime140d.dll <-- SysWOW64\vcruntime140d.dll
  • ucrtbased.dll <-- SysWOW64\ucrtbased.dll
  • 除了我已经构建的opencv*文件之外,我还需要从C:\Windows\SysWow64(32位系统为System32)复制系统文件。

    不用谢。:-)


    2
    如果你并非真正利用 Debug 库,而只是尝试在默认的 VS “Debug” 配置下编译,那么你可以简单地切换到“Release”配置。 - Patrizio Bertoni
    1
    对我来说,程序使用“多线程调试(/MTd)”编译不通过,只有改用“多线程调试 DLL(/MDd)”才行。在我的情况下(我有额外的依赖项,但没有 MSVCP120D.DLL 版本,只有 MSVCP120.DLL),解决方案是:1)切换到调试模式;2)将链接器>输入>>附加依赖项库更改为它们的无调试版本(去掉“d”)。 - asam
    1
    我犯了一个小错误。如此提到:“Visual C++ Redistributable Packages for Visual Studio 2013 (x86 and x64)。”。你需要安装86和64位版本。 (https://www.microsoft.com/en-us/download/details.aspx?id=40784)我只安装了64位版本。但是在安装了两个版本后,问题就解决了。 - Tyagi Akhilesh

    4

    我下载了32位版本的 msvcr120d.dllmsvcp120d.dll,然后将它们放入我的项目的 Debug 文件夹中。这样做很有效。(我的电脑是64位版本)


    这条评论对我有所帮助,但是没有提供下载文件的位置。我成功下载了VS2013社区版(32位),并将文件复制到了调试文件夹中。 - Jerin

    4
    我在使用VS 2015实现OpenCV 2.4.11时遇到了和你一样的问题。我试过三种方法来解决这个问题,但是它们都没有奏效:
    1. 在网上下载MSVCP120.DLL并将其添加到Windows路径和OpenCV二进制文件路径中。 2. 安装Visual C++ Redistributable Packages for Visual Studio 2013的x86和x86版本。 3. 调整Debug模式。进入配置>C/C++>代码生成>运行库,然后选择多线程调试(/MTd)。
    最终,我通过重新安装VS2015并选择可以安装的所有选项来解决了这个问题。虽然需要占用很多空间,但确实有效。

    我也在尝试在VS 2015上使用OpenCV 3.1.0,但一直没有成功。我已经尝试了这三种解决方案,但都无济于事。我正在考虑尝试您提供的安装全部的修复方法。您是使用VS社区版吗? - NickF
    谢谢,对我的 C++ 初级“hello world”项目有帮助(该项目使用了 Windows.h 和 iostream,而且在64位系统上运行不正常)。 - liquide

    2

    我在使用 Visual Studio Pro 2017 时遇到了相同的问题:Release 模式下缺少 MSVCP120.dll 文件,Debug 模式下缺少 MSVCP120d.dll 文件。 根据 Microsoft 的回答建议,我安装了 Visual Studio 2013 的 Visual C++ Redistributable PackagesVisual C++ 2013 和 Visual C++ Redistributable Package 的更新,这解决了 Release 模式下的问题。 对于 Debug 模式,最终起作用的方法是从另一台电脑(带有 Visual Studio 2013)复制 msvcp120d.dll 和 msvcr120d.dll 文件到 C:\Windows\System32 目录中。


    2

    我遇到的问题是针对远程测试机器进行x64编译。我在以下位置找到了msvp120d.dll和msvcr120d.dll的x64版本:

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\Debug_NonRedist\x64\Microsoft.VC120.DebugCRT
    

    0

    另一种方法:无需安装Redistributable包。

    在一些github上查找相关的dll,有些人会上传应用程序依赖的参考dll。

    您可以下载并在您的项目中使用它们,我已经成功地使用和运行它们。

    例如:https://github.com/Emotiv/community-sdk/find/master


    0
    我在使用VS 2019构建我的应用程序时遇到了这个问题。你可以从this位置复制这些DLL文件到你的应用程序的调试目录中,以便继续进行。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接