在VS中编译C++,而不需要在运行时使用MSVCP120D.dll

Compile C++ in VS without requiring MSVCP120D.dll at runtime

本文关键字:运行时 dll MSVCP120D 不需要 VS 编译 C++      更新时间:2023-10-16

我正在尝试制作一个二进制文件,它可以在任何windows机器上运行,而无需安装visual c++(我假设这就是MSVCP120D.dll,但我的搜索结果并不是很好)。我为一项任务制作了一个游戏,想让其他人(没有安装VS的非开发者)帮我测试它,但他们不断收到错误,说上面的dll丢失了。我没有使用任何Visual C++的东西,并且设置了/Za标志以确保它只是ANSI C++。Visual Studio支持编译ANSI C++吗?如果支持,我该如何让它不使用Visual C++的东西?如果它不支持,我应该使用什么编译器?

如您所见,MSVCP DLL是C++标准库的平台实现。简而言之,这意味着您不能在不需要这些库提供的"东西"的情况下分发应用程序。所有编译器,无论平台如何,都需要某种标准库的实现。通常,这是以库的形式分发的。

但是,您可以分发您的应用程序,以便"东西"直接内置到您的程序中,而不是在单独的DLL中提供。为此,必须将应用程序静态链接到标准库。

有几种方法可以做到这一点。一种方法是在"项目设置"中。在"项目">"配置属性">"C/C++代码生成">"运行时库"中,选择"多线程(/MT)",而不是"多线程的(静态)"。


顺便说一句,您上面提到的"MSVCP120D.dll"中的"D"意味着"调试"。这意味着您正试图分发程序的调试版本。你(几乎)永远不应该这样做。而是分发发布版本。

您有三个选项(按照我建议的顺序):

  1. 不要静态链接,而是让想要运行游戏的人安装visual studio可重新分发的软件包。此处为32位VC 2010版本:http://www.microsoft.com/en-us/download/details.aspx?id=5555

  2. 静态链接CRT(运行时不需要的dll)请参阅此处以获取详细信息:如何使用Visual Studio Express 2005生成完全静态链接的.exe?

  3. 构建一个根本不使用CRT的应用程序。在这里,您必须实现自己的操作符new,它调用HeapAlloc(),操作符delete调用HeapFree(),这是一个有趣的挑战;)。要做到这一点,您需要告诉链接器忽略所有默认的库。

使用静态运行库而不是DLL版本进行构建。

转到"属性"、"C/C++"、"代码生成"、"运行库",然后选择/MTd或/MT,而不是/MDd和/MD选项。

将项目配置为静态链接到运行时,而不是动态链接。

首先,名称末尾的D表示调试构建。如果你制作了一个发布版本,那么它将需要没有D的版本。这一点很重要,因为微软不允许在没有visual studio的情况下分发调试库。

您尝试运行程序的计算机可能已经安装了发行版运行时,因为许多程序都在使用它。如果没有,请安装http://www.microsoft.com/en-us/download/details.aspx?id=30679在机器上(我认为这是正确的,但目前无法检查)

您将需要静态链接,它"内置"到二进制文件中的外部库调用。它确实增加了较大二进制文件的影响,但在您的情况下,这听起来并不是什么大不了的事。

附带说明一下,MSVCP120D.dll是包含所有调试C++库(即iostreamstring等)的Microsoft Visual C++ 12 debug DLL(动态链接库)。这个库就是你要"烘焙"到最终二进制文件中的东西。

希望能有所帮助。

当我试图在另一台安装了新版本Visual Studio的计算机上执行exe时,遇到了这个错误。你需要更改项目属性并重新编译才能消除这个问题。

为此:

  1. 打开要运行的解决方案
  2. 右键单击项目文件->属性
  3. 在"配置属性"answers"常规"中,确保将平台工具集配置为计算机上的正确编译器。如果它不正确,它应该在旁边显示一条消息,说明它没有安装
  4. 重新构建并运行代码,您就不会再遇到问题了