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

时间:2014-01-02 19:36:39

标签: c++ dll visual-studio-2013

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

7 个答案:

答案 0 :(得分:16)

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

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

有几种方法可以实现这一目标。一种方法是在项目设置中。在“项目”中> “配置属性”> “C / C ++代码生成”> “Runtime Library”,选择“Multithreaded(/ MT)”而不是“Mutithreaded(Static)”。


顺便说一下,上面提到的“MSVCP120D.dll”中的“D”表示“调试”。这意味着您正在尝试分发程序的 debug 版本。你应该(几乎)永远不要这样做。相反,分发版本构建。

答案 1 :(得分:6)

您有三种选择(按我推荐的顺序):

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

  2. 静态链接CRT(运行时不想要的dll)详情请见此处:How do I make a fully statically linked .exe with Visual Studio Express 2005?

  3. 构建一个根本不使用CRT的应用程序。在这里,您必须实现自己的调用HeapAlloc()的operator new,以及调用HeapFree()的operator delete,这是一个有趣的挑战;)。要执行此操作,请告知链接器忽略所有默认库。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

首先,名称末尾的D表示调试版本。如果您进行发布版本,那么它将需要它而不需要D.这很重要,因为微软不允许在没有visual studio的情况下分发调试库。

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

答案 5 :(得分:0)

你需要static linking,即“内置”外部库调用你的二进制文件。它确实有更大的二进制文件的附加影响,但在你的情况下听起来不是那么大的交易。

另外,MSVCP120D.dll是Microsoft Visual C++ 12 debug DLL(动态链接库),其中包含所有调试C ++库(即iostreamstring等)。那个库就是你将“烘焙”到你最后的二进制文件中的。

希望有所帮助。

答案 6 :(得分:0)

当我尝试在其上安装了较新版本Visual Studio的其他计算机上执行我的exe时遇到此错误。您需要更改项目属性并重新编译才能使其消失。

要做到这一点:

  1. 打开您尝试运行的解决方案
  2. 右键单击项目文件 - >特性
  3. 在“配置属性”和“常规”中,确保将平台工具集配置为计算机上的正确编译器。如果不正确,则应在其旁边显示一条消息,说明未安装。
  4. 再次构建并运行代码,您不应再遇到问题。