48

我是 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”在文件系统中的位置?

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

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

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

4

2 回答 2

64

术语“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 安装在用户计算机上的一种简单方法是使用预构建的安装程序。您可以从此处下载它(注意:仅在今天有效,当服务包或更新可用时,这可能会改变)。或者您可以简单地将它们复制到与您的主 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 上运行的程序. 当您这样做时,某些功能会丢失,与语言环境和线程本地存储相关联,需要进行测试。

于 2013-02-07T13:33:33.930 回答
22

这里什么都没有......如果你发现错误,请插话。

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,其他类似),则在项目属性中:

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

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

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

4. 如果“C/C++ Runtime Library”动态链接到项目,我怎么知道使用了哪个“.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

如果这是一个问题,您可以将可再发行包与您的安装程序捆绑在一起:Visual Studio Redistributable 和 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。

于 2013-02-07T11:59:04.213 回答