Microsoft Visual Studio〜C / C ++运行时库〜静态/dynamic链接

我是Microsoft Visual Studio用户。 我的问题是关于“C / C ++运行时库”。

我创build了一个带有“.cpp”源文件“main.cpp”的“Empty Project”,其中包含以下代码:

#include <iostream> int main(void) { std::cout << "Hello World" << std::endl; return 0; } 

“iostream是一个用于C ++编程语言的input/输出的头文件,它是C ++标准库的一部分。

  1. “C / C ++运行时库”和“C / C ++标准库”有什么不同?

  2. 如何知道“C / C ++运行时库”库是静态还是dynamic链接到项目?

  3. 我怎么知道这个库在文件系统中的位置?

  4. 如果“C / C ++运行时库”dynamic链接到项目中,怎样才能知道使用了哪个“.dll”以及文件系统中使用的“.dll”的位置?

  5. 假设我将“C / C ++运行时库”静态链接到项目,我可以确定从源代码生成的可执行文件可以在所有的Windows平台(XP / Vista / Seven / …,32位/ 64位)?

  6. 将“C / C ++运行时库”dynamic链接到项目有什么优点/缺点?

  7. “C / C ++运行时库”应该静态还是dynamic地链接到项目?

谢谢你的回答。

术语“C / C ++运行时库”没有任何意义,它大致是IDE中项目设置的名称。 项目+属性,C / C ++,代码生成,运行时库设置。 在那里你可以select/ MD和/ MT。

使用/ MD,默认设置,您的程序将使用运行时库的DLL版本。 在您的机器上,它们被Visual Studio安装程序复制到c:\ windows \ system32和/或c:\ windows \ syswow64中。 而且你已经在VS安装目录的vc / redist子目录中获得了它们的副本,供你在为程序创build安装程序时使用。 他们有三个版本,x86为32位Intel处理器,64位为Intel处理器,arm为ARM处理器。 根据您在项目中select的平台select合适的平台。

相关的DLL名称是:

  • msvcr110.dll:C运行时库(memcpy等)
  • msvcp110.dll:C ++标准库(std :: string et al)
  • vccorlib110.dll:Windowsapp store应用程序的运行时库
  • vcomp110.dll:OpenMP的运行时库(请参阅#pragma omp)
  • atl110.dll:ATL项目的运行时库
  • mfc110 * .dll:MFC项目的运行时和本地化库
  • vcamp110.dll:AMP项目的运行时库

在你的机器上,你也得到了这些DLL的debugging版本,由VS安装程序复制到Windows目录。 它们与附加的字母“d”具有相同的名称。 只用于debugging你的代码,你不能重新分配它们。 相应的运行时库设置是/ MDd。

大多数C ++项目只需要msvcr110.dll和msvcp110.dll,当你select使用其他库时,你会知道,因为它们有特定的项目模板和设置。

获取用户计算机上安装的所有这些DLL的简单方法是使用预构build的安装程序。 您可以从这里下载(注意:目前仅在今天,当服务包或更新可用时,这可能会改变)。 或者您可以简单地将它们复制到主EXE所在的目录中。

您可以通过将运行时库设置更改为/ MT来避免依赖于这些DLL。 在这种情况下,运行时支持代码链接到您的程序中,您将只有一个EXE部署。 这样做当然会变得更大,尤其是当你使用MFC的时候。

如果你创buildDLL和EXE,使用/ MT是有风险的。 你的程序中会有多个CRT副本。 对VS的早期版本来说,这尤其是一个问题,每个CRT都会有自己的堆,而VS2012则没有这么多。 但是当你有多个“errno”variables时,你仍然可能会遇到难看的运行时问题。 强烈build议使用/ MD来避免这种损失。

您的程序将在Windows Vista,7和8上运行。对XP的支持正在减弱,您将需要VS Update 1并将项目中的工具集设置从“v110”更改为“v110_xp”,以创build仍然在XP上运行的程序。 当你这样做的时候,一些function会丢失,与语言环境和线程本地存储相关联,testing是必需的。

这里什么也没有…如果你发现一个错误,

1.“C / C ++运行时库”和“C / C ++标准库”有什么不同?

是和不是。 有时人们使用运行时库来表示一切,完全忽略标准库(对于微软工具)。 然而,从技术上讲,运行时库是在运行时加载的,所以它包含了对.lib(import lib)和.dll。 详情请参阅: http : //msdn.microsoft.com/en-us/library/vstudio/abx4dbyh(v=vs.100).aspx

从技术上说,libc *是标准库,* crt是运行时库。

2.如何知道“C / C ++运行时库”库是静态还是dynamic链接到项目?

如果您使用的IDE(VS2010,其他类似),这是在项目属性:

 - configuration properties - c/c++ - code generation [Runtime Library] 

3.我怎么知道这个库在文件系统中的位置?

lib文件位于sdk的lib目录(如果您安装了更高版本的Windows sdk)或visual c ++目录。

4.如果“C / C ++运行时库”dynamic链接到项目中,怎样才能知道使用了哪个“.dll”以及文件系统中使用的“.dll”的位置?

你可以通过使用依赖工具来确定使用哪一个。 http://www.dependencywalker.com/

DLL在Windows目录中的某处。 他们把他们移动,现在在时髦的地方有体现和东西来跟踪版本。 我不会太担心这个。 如果你不得不担心这个,可能是错的。 有关详细信息: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa375365( v = vs.85).aspx http://en.wikipedia.org/wiki/Side-by-side_assembly

如果这是一个问题,可以使用安装程序捆绑可重新分发的软件包: Visual Studio Redistributable和Visual Studio SP1之间的区别

5.假设我将“C / C ++运行时库”静态链接到项目,我可以确定从源代码生成的可执行文件可以在所有的Windows平台(XP / Vista / Seven / …,32位/ 64位)?

是的,如果你静态链接,那么你无法find该DLL更安全。 但是,这会使您的可执行文件变大。 在行为方面还有其他的后果……这是很难枚举的,但不同之处在于这个库是在一个dll中编译进你的exe中的。

6.将“C / C ++运行时库”dynamic链接到项目有什么优点/缺点?

为什么使用dll:

一个大小。 更小的exe文件大小,因为所有库的东西都在应该已经安装在用户的系统上的dll中,尽pipe这有时并不正确。

b – 如果运行时存在错误,则Microsoft可以将新版本推送给用户。 你不必处理它。 如果您静态链接,则必须将新的exe文件推送给用户。

为什么不使用dll:

– 处理DLL的许多问题。 如果忘记捆绑重组,可能会出现很多问题。

b – 有更多的DLL加载和卸载导致启动和退出时间较慢。

可能其他原因,我没有想到…

7.“C / C ++运行时库”应该静态还是dynamic地链接到项目?

它真的取决于。 我个人更喜欢静态链接。 我讨厌寻找正确的redist / dll /等。