2013-02-07 97 views
32

我是Microsoft Visual Studio用户。 我的问题是关于“C/C++运行时库”。Microsoft Visual Studio〜C/C++运行时库〜静态/动态链接

我创建了一个“空项目的”与“的.cpp”源文件‘main.cpp中’包含以下代码:

#include <iostream> 

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

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

  1. 是否有 “C/C++运行时库” 和 “C/C++ 标准库” 之间的区别吗?

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

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

  4. 在的情况下,“C/C++运行时库”的动态链接到 项目,我怎么能知道哪些“.DLL”的使用和使用的 “的.dll”位于文件系统在哪里?假设我将“C/C++运行时库”静态链接到项目,我可以确定从源代码生成的可执行文件可以在所有Windows平台(XP/Vista/7/...上运行)。 ,32位/ 64位)?

  5. 将“C/C++运行时间 库”动态链接到项目有什么优点/缺点?

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

谢谢你的回答。

+0

我想你会在微软网站上找到更多信息。无论如何,总之,大量的程序需要你下载'vc_redists',所以我没有理由不期望它可以被安装。 –

+0

您能否更具体地了解哪些地方可以在Microsoft网站上找到相关信息? 我不确定我是否理解了答案的第二部分。在动态链接的情况下,必须提供程序集以防目标系统上不存在的情况...不是吗? –

+0

运行时组件可以[从Microsoft下载](http://stackoverflow.com/questions/11056812/where-to-download-vcredist)。它只需要做一次,所以如果你的程序不是第一个使用特定编译器版本的程序,它就可以工作。 –

回答

19

这里没有任何意义......如果您发现错误,请点赞。

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++运行时库”库是静态还是动态链接到项目?

如果您使用的IDE(VS2010,其他都差不多),这是在项目属性:

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

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

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

4.情况下,“C/C++运行时库”动态链接到这个项目,我怎么能知道哪些“的.dll”被使用,在使用“.dll文件”位于文件系统?

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

DLLs在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:

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

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

为什么不使用DLL:

一个 - 许多问题与处理DLL。如果你忘记捆绑重做,很多问题都会出现。

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

,我都没有想到的可能是其他原因......

7.如果“C/C++运行时Libray”,而静态或动态链接到这个项目?

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

54

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

使用/ MD,默认设置,您的程序将使用DLL版本的运行时库。在您的机器上,它们被Visual Studio安装程序复制到c:\ windows \ system32和/或c:\ windows \ syswow64中。并且您已将它们的副本放在VS安装目录的vc/redist子目录中,供您在为程序创建安装程序时使用。它们的三个版本,用于32位英特尔处理器的x86,用于64位英特尔处理器的x64以及用于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上运行。与语言环境和线程本地存储相关联时,某些功能会丢失,因此需要进行测试。

+0

也许值得一提的是“v110_xp”也适用于Windows Server 2003。 –