首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microsoft Visual Studio ~ C/C++运行时库~静态/动态链接

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

Stack Overflow用户
提问于 2013-02-07 11:08:32
回答 2查看 47.9K关注 0票数 48

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

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

代码语言:javascript
复制
#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“位于文件系统中的位置?
  5. 假设我静态地将"C/C++运行时库“链接到项目,是否可以确保从源代码生成的可执行文件将在所有Windows平台(XP/Vista/7/.,32位/64位)上工作?
  6. 动态链接"C/C++运行时库“到项目的优缺点是什么?
  7. "C/C++运行时库“是否应该静态地或动态地链接到项目?
EN

回答 2

Stack Overflow用户

发布于 2013-02-07 13:33:33

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

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

相关的DLL名称是:

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

在您的计算机上,您还得到了这些DLL的调试版本,这些DLL由VS安装程序复制到Windows目录。他们的名字和后面的字母"d“相同。只对调试代码有用,不能重新分发它们。相应的运行时库设置是/MDd。

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

在用户的计算机上安装所有这些all的一个简单方法是使用预构建的安装程序。您可以下载它从这里开始 (注意:仅从今天开始,这可能会在服务包或更新可用时发生变化)。或者您可以简单地将它们复制到与主EXE相同的目录中。

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

如果创建DLL以及EXE,则使用/MT是有风险的。最后,您将在您的程序中获得多个CRT副本。对于VS的早期版本来说,这尤其是一个问题,因为每个CRT都有自己的堆,而不是VS2012。但是,当您有多个"errno“变量时,运行时问题仍然很严重。强烈建议使用/MD来避免这种损失。

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

票数 65
EN

Stack Overflow用户

发布于 2013-02-07 11:59:04

这没什么..。如果你发现一个错误,请插进去。

1. "C/C++运行时库“与"C/C++标准库”是否有区别?

是也不是。有时,人们使用运行时库来表示一切,而忽略标准库(对于Microsoft )。但是,从技术上讲,运行库是在运行时加载的,因此它包括对.lib (导入库)和.dll。详见此处:http://msdn.microsoft.com/en-us/library/vstudio/abx4dbyh(v=vs.100).aspx

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

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

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

代码语言:javascript
复制
-  configuration properties
        - c/c++
               - code generation
                      [Runtime Library]

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

库文件位于sdk的lib dir (如果安装了较后的windows )或Visual目录中。

4.在"C/C++运行时库“被动态链接到项目的情况下,我如何知道所使用的".dll”以及所使用的".dll“位于文件系统中的位置?

您可以通过使用“依赖”工具找出使用的是哪些。http://www.dependencywalker.com/

DLL位于Windows目录中的某个位置。他们移动他们,现在它是在时髦的地方与清单和东西,以保持跟踪版本。我不会太担心这个的。如果你要担心这件事,可能是出了问题。详细信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa375365(v=vs.85).aspx 组件

如果这是一个问题,您可以将一个可再发行的包与安装程序捆绑在一起:Visual可再发行与Visual SP1的区别

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

是的,如果您静态链接,那么您就更安全了,因为您无法找到dll。但是,这会使您的可执行文件更大。在行为上还有其他的后果。很难枚举,但区别在于库位于编译到exe中的dll中。

6.动态链接"C/C++运行时库“到项目的优缺点是什么?

为什么使用dll:

A号的。较小的exe大小,因为所有库内容都在dll中,这些dll应该已经安装在用户的系统上,尽管有时不是这样。

如果运行时有错误,微软可以把新的版本推给用户。你没必要去处理它。如果静态链接,则必须将新的exe推送给用户。

为什么不使用dll:

处理dll的许多问题。如果你忘了把redist捆绑在一起,很多问题就会出现。

有更多的dll来加载和卸载会导致启动和退出时间更慢。

可能还有其他我没有想到的原因..。

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

真的要看情况了。我个人更喜欢静态链接。我讨厌到处寻找合适的redist/dll/等等。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14749662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档