【问题标题】:Are c++ standard libraries static libraries?c++ 标准库是静态库吗?
【发布时间】:2018-05-04 04:36:54
【问题描述】:

当我们创建一个静态库时,我们必须为客户端提供2个文件:

  • .h 文件
  • .lib 文件

但是,当我们创建动态库时,我们必须为客户端提供3个文件:

  • .h 文件
  • .lib 文件(又名导入文件)
  • .dll 文件

据我所知,我无法构建一个客户端应用程序(例如控制台应用程序)

  • 静态链接到动态库
  • 动态链接静态库

问题

当我如下构建一个简单的控制台应用程序时,例如:

#include <iostream>

int main()
{
    std::cout << "Hello World!";

    return 0;
}

输出(在本例中为 .exe 文件)是独立的。 是不是说“所有c++标准库都是静态库”?

【问题讨论】:

  • 请注意:DLL 是 Microsoft 的东西。其他操作系统不会那样做两个二进制文件库的舞蹈。共享库位于 .so 文件中,您可以链接到该文件。 (在这两种情况下,您都需要一个 .h 文件来告诉编译器库提供了什么)。

标签: c++


【解决方案1】:

输出(在本例中为 .exe 文件)是独立的。是不是说“所有c++标准库都是静态库”?

没有。没有。

当我在 Linux 中对一个简单的 C++ 程序执行 ldd 时,我得到了。

linux-vdso.so.1 =>  (0x00007ffc125f2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6e371b2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6e3757c000)

这意味着,除非您拥有这些动态库,否则可执行文件将无法运行。

您会在 Windows 上找到类似的依赖项。

【讨论】:

  • 谢谢。这是否意味着我们总是可以静态链接任何 DLL 文件?
  • 没有。您不能静态链接 DLL。有一个对应于 DLL 的 .lib 文件。链接器需要该 .lib 文件来创建 .exe,但在运行时需要 DLL。
  • 谢谢。在我的理解中,只有两种类型的库:静态库和动态库。所以c++标准库肯定属于其中之一,但属于哪一个呢?
  • @ArtificialStupidity,标准没有指定。进行该调用取决于实现。我的经验仅限于桌面编译器(g++ 和 Visual Studio)。他们都碰巧使用动态库。我怀疑clang也使用动态库,但我没有任何经验。
【解决方案2】:

在 Windows 上,至少在使用 Visual Studio 构建时,您可以选择是链接到静态 (.lib) 还是动态 (.dll) 运行时库。您可以在某处的项目设置中选择它。

前者使您的 .exe 更具可移植性,因为它不依赖于您链接的运行时库版本的 DLL,以防止出现在目标计算机上。因此,这是我个人的偏好。后者使您的程序更小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2017-03-16
    相关资源
    最近更新 更多