当我使用STL在Linux上编译C ++程序时,STL库如何链接?

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

对我来说,静态的听起来很奇怪,因为这意味着一个使用STL的C ++程序都必须在内部包含它。 另一方面,dynamic链接的声音对我来说也是奇怪的,就像所有的OOP的东西,我不明白如何dynamic链接库,也支持不同种类的对象…

那么究竟发生了什么?

答案在你的问题: STL代表“标准模板库”。 由于模板位于头文件中,只有在需要时(例如使用)才能实例化,所以可以包含每个STL头(如果需要的话),如果不使用任何头,那么二进制文件将不会更大。

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

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

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

部分动态,部分静态:

  • 静态获取链接的所有模板实例(显式或隐式)
  • 其他东西动态链接

这个简单的例子:

 #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