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

时间:2013-02-07 11:08:33

标签: c++ visual-studio microsoft-runtime-library

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

我创建了一个"空项目"用" .cpp"源文件" main.cpp"包含以下代码:

#include <iostream>

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

&#34; iostream是一个头文件,用于C ++编程语言的输入/输出。 它是C ++标准库的一部分。&#34;

  1. &#34; C / C ++运行时库&#34;之间是否存在差异?和&#34; C / C ++ 标准图书馆&#34;?

  2. 我如何知道&#34; C / C ++运行时库&#34; 库是静态还是动态链接到项目?

  3. 如何知道此库在文件系统中的位置?

  4. 如果是&#34; C / C ++运行时库&#34;动态链接到 项目,我怎么知道哪个&#34; .dll&#34;使用和使用的地方 &#34;的.dll&#34;位于文件系统中?

  5. 假设我静态链接&#34; C / C ++运行时库&#34;在项目中,我可以确定从源代码生成的可执行文件是否适用于所有Windows平台(XP / Vista / Seven / ...,32位/ 64位)?

  6. 动态链接&#34; C / C ++运行时库&#34;有哪些优点/缺点?到项目?

  7. &#34; C / C ++运行时库&#34;而是静态或动态地链接到项目?

2 个答案:

答案 0 :(得分:58)

术语“C / C ++运行时库”并不意味着什么,它大致是IDE中项目设置的名称。项目+属性,C / C ++,代码生成,运行时库设置。在那里你可以选择/ MD和/ MT。

使用/ MD(默认设置),您的程序将使用运行时库的DLL版本。在您的计算机上,Visual Studio安装程序将它们复制到c:\ windows \ system32和/或c:\ windows \ syswow64中。并且您已经在VS安装目录的vc / redist子目录中获得了它们的副本,供您在为程序创建安装程序时使用。它们有三个版本,x86用于32位Intel处理器,x64用于64位Intel处理器,arm用于ARM处理器。根据您在项目中选择的平台选择正确的。

相关的DLL名称是:

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

在您的计算机上,您还获得了这些DLL的调试版本,由VS安装程序复制到Windows目录中。它们具有相同的名称,并附加字母“d”。仅用于调试代码,不能重新分发它们。相应的运行时库设置为/ MDd。

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

在用户的计算机上安装所有这些DLL的简单方法是使用预构建的安装程序。您可以下载from here(注意:截至今天,当服务包或更新可用时,这可能会更改)。或者您只需将它们复制到与主EXE相同的目录中即可。

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

如果您创建DLL和EXE,使用/ MT是有风险的。您最终会在程序中使用CRT的多个副本。对于早期版本的VS来说,这尤其是一个问题,其中每个CRT都会获得自己的堆,而不是VS2012。但是,当你有多个“errno”变量时,你仍然会遇到难看的运行时问题。强烈建议使用/ MD以避免此类损失。

您的程序将在Windows Vista,7和8上运行。对XP的支持正在减弱,您需要VS Update 1并将项目中的工具集设置从“v110”更改为“v110_xp”以创建仍然可用的程序在XP上运行。执行此操作时会丢失某些功能,与区域设置和线程本地存储相关联,需要进行测试。

答案 1 :(得分:20)

这里什么都没有......如果你发现错误,请发出声音。

<强> 1。 “C / C ++运行时库”和“C / C ++标准库”之间有区别吗?

是和否。有时人们使用运行时库来表示一切并完全忽略标准库(对于Microsoft工具)。但是,从技术上讲,运行时库是在运行时加载的,因此它包含一对.lib(import lib)和.dll。有关详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/vstudio/abx4dbyh(v=vs.100).aspx

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

<强> 2。我如何知道“C / C ++运行时库”库是静态还是动态链接到项目?

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

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

第3。我如何知道该库在文件系统中的位置?

lib文件位于sdk的lib目录中(如果安装了以后的windows sdk)或Visual C ++目录。

<强> 4。如果“C / C ++运行时库”动态链接到项目,我怎么知道使用了哪个“.dll”以及用过的“.dll”在文件系统中的位置?

您可以使用depends工具确定使用哪些。 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

如果这是一个问题,您可以将可再发行软件包与安装程序捆绑在一起:Difference between Visual Studio Redistributable and Visual Studio SP1

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

是的,如果您静态链接,那么就无法找到dll而言,您会更安全。但是,这会使您的可执行文件更大。在行为方面还有其他后果......难以枚举,但差异来自于库在dll中编译到你的exe中这一事实。

<强> 6。将“C / C ++运行时库”动态链接到项目有哪些优点/缺点?

为什么要使用dll:

a - 尺寸。较小的exe大小,因为所有库的东西都在dll中,应该已经安装在用户的系统上,尽管有时这不是真的。

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

为什么不使用dll:

a - 处理dll的许多问题。如果你忘了捆绑redist,可能会出现很多问题。

b - 有更多dll加载和卸载会导致启动和退出时间变慢。

可能是我没想过的其他原因......

<强> 7。 “C / C ++运行时库”是否应该静态或动态地链接到项目?

这取决于。我个人更喜欢静态链接。我讨厌四处寻找合适的redist / dll / etc。