【问题标题】:Microsoft Visual Studio ~ C/C++ Runtime Library ~ Static/dynamic linkingMicrosoft Visual Studio ~ C/C++ 运行时库 ~ 静态/动态链接
【发布时间】:2013-01-22 20:48:04
【问题描述】:

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

【问题讨论】:

  • 我想您可以在 Microsoft 网站上找到更多信息。总之,很多程序都需要你下载vc_redists,所以我没有理由不期待它/可以安装。
  • 您能否更具体地了解在 Microsoft 网站上的何处可以找到信息?我不确定我是否理解您答案的第二部分。在动态链接的情况下,必须提供程序集以防它们不在目标系统上......不是吗?
  • 运行时组件可以是downloaded from Microsoft。它只需要执行一次,所以如果你的程序不是第一个使用特定编译器版本的程序,它就可以工作。
  • 标准方式是使用动态链接。运行时依赖问题通过创建安装包来解决 - 看看安装和部署 Visual Studio 项目。静态链接仅在某些特殊情况下使用。
  • @AlexFarber 实际上几乎在您分发独立 exe 的任何时候,通常都会这样做,静态链接更安全。由于安装的权限问题,有时首选独立 exe。 (例如chiark.greenend.org.uk/~sgtatham/putty/download.html -- 方便,winscp、vnc 和其他酷的 windows 工具也一样)

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


【解决方案1】:

术语“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 上运行。这样做会丢失一些功能,与语言环境和线程本地存储相关联,需要进行测试。

【讨论】:

  • 可能值得注意的是,“v110_xp”也适用于 windows Server 2003。
【解决方案2】:

这里什么都没有……如果您发现错误,请指出。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 2011-01-03
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    相关资源
    最近更新 更多