【问题标题】:When I compile a C++ program on Linux using the STL, how is the STL library linked?当我在 Linux 上使用 STL 编译 C++ 程序时,STL 库是如何链接的?
【发布时间】:2013-11-12 16:12:34
【问题描述】:

当我使用 g++ 编译使用 STL 的程序时,库如何链接到我的程序?动态还是静态?

静态对我来说听起来很奇怪,因为这意味着每个使用 STL 的单个 C++ 程序都必须在内部包含它。另一方面,动态链接对我来说也很奇怪,就像所有 OOP 的东西一样,我看不出如何动态链接库并且还支持不同类型的对象...

那么这里到底发生了什么?

【问题讨论】:

  • 模板总是根据需要实例化(因此它们总是包含在你的二进制文件中)其余的可以动态链接
  • STL 已成为 C++ 的一部分,因此,它作为 C++ 链接(如果需要,动态链接)
  • @DieterLücking:C/C++ 运行时可以静态或动态链接,但 STL 部分不过是头文件的集合。
  • STL 绝不是面向对象的。
  • @ZacHowland 我敢打赌,一些模板专业化是外部的,并且随库一起提供(例如:语言环境)

标签: c++ linux g++ static-linking dynamic-linking


【解决方案1】:

答案就在您的问题中:STL 代表“标准 模板 库”。由于模板位于头文件中,并且仅在需要时(例如使用)才实例化,因此您可以包含每个 STL 头(如果需要),如果您不使用其中任何一个,您的二进制文件将不会更大。

STL 不是必须链接的 .lib 或 .a 文件。是头文件的集合。

【讨论】:

    【解决方案2】:

    模板总是根据需要进行实例化,并且根据他们使用的对象量身定制的实例是生成的二进制文件的一部分。

    不基于模板的 STL 的其余部分可以静态或动态链接,具体取决于您的编译器设置。

    【讨论】:

      【解决方案3】:

      部分动态,部分静态:

      • 静态获取链接所有模板实例化(显式或隐式)
      • 其他内容动态链接

      这个简单的例子:

      #include <vector>
      
      int main()
      {
          std::vector<int> v;
      }
      

      像编译一样

       g++  xxx.cpp -g  -Wall -Wextra
      

      生成一个链接下一个库的文件:

      $ ldd a.out 
              linux-vdso.so.1 =>  (0x00007fffa7767000)
              libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f353bee7000)
              libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f353bcd1000)
              libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f353b908000)
              libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f353b604000)
              /lib64/ld-linux-x86-64.so.2 (0x00007f353c20c000)
      

      它有矢量符号:

      $ nm a.out | grep vector
      000000000040073e W _ZNSt6vectorIiSaIiEEC1Ev
      000000000040073e W _ZNSt6vectorIiSaIiEEC2Ev
      0000000000400758 W _ZNSt6vectorIiSaIiEED1Ev
      0000000000400758 W _ZNSt6vectorIiSaIiEED2Ev
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 2011-01-10
        相关资源
        最近更新 更多