c++ - Microsoft Visual Studio ~ C/C++ Runtime Library ~ 静态/动态链接

标签 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;
}

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

  1. “C/C++运行时库”和“C/C++”有区别吗 标准库”?

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

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

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

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

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

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

最佳答案

“C/C++ Runtime Library”这个词没有任何意义,大致就是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 的调试版本,这些 DLL 已被 VS 安装程序复制到 Windows 目录。它们具有相同的名称并附加了字母“d”。仅对调试代码有用,不能重新分发它们。对应的Runtime Library设置为/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 上运行。这样做会丢失一些与语言环境和线程本地存储相关的功能,需要进行测试。

关于c++ - Microsoft Visual Studio ~ C/C++ Runtime Library ~ 静态/动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39018250/

相关文章:

c++ - 初始化 boost::scoped_ptr 数组的正确方法?

C++11 文件流

c# - 在 Visual Studio 中配置触发智能感知完成的键

c++ - 删除指针导致内存泄漏?

c++ - 密码无效

c# - Visual Studio 可以告诉我哪个引用引发了 NullReferenceException 吗?

c++ - x86 和 x64 上 pow 的不同结果

c++ - 您可以使用旧的运行时库构建 Visual C++ 2013 吗?

c++ - LNK4098 - 使用 GLFW 的 'MSVCRT' 冲突

c++ - 如何创建不可移动/复制构造的对象数组