Когда я компилирую программу на C++ в Linux с помощью STL, как подключается библиотека STL?

Когда я компилирую программу, использующую STL, используя g++, как библиотека связывается с моей программой? Динамически или статически?

Для меня это звучит странно, так как это означало бы, что каждая программа на C++, использующая STL, должна была бы включать его внутри. С другой стороны, динамическое связывание звучит для меня также странно, как и со всеми вещами ООП, я не понимаю, как библиотека может быть связана динамически, а также поддерживать различные виды объектов...

Итак, что именно здесь происходит?


person pap42    schedule 12.11.2013    source источник
comment
Шаблоны всегда создаются по мере необходимости (поэтому они всегда включаются в ваш двоичный файл). Остальное можно связать динамически.   -  person Erbureth says Reinstate Monica    schedule 12.11.2013
comment
STL стал частью C++, поэтому он компонуется как C++ (при необходимости динамически).   -  person    schedule 12.11.2013
comment
@DieterLücking: среды выполнения C/C++ могут быть связаны статически или динамически, но часть STL представляет собой не что иное, как набор файлов заголовков.   -  person Zac Howland    schedule 12.11.2013
comment
STL совсем не объектно-ориентированный.   -  person n. 1.8e9-where's-my-share m.    schedule 12.11.2013
comment
@ZacHowland Бьюсь об заклад, некоторые специализации шаблонов являются внешними и поставляются с библиотекой (например, локаль)   -  person    schedule 12.11.2013
comment
@DieterLücking Он может быть явно создан в двоичной библиотеке, но это зависит от реализации.   -  person Zac Howland    schedule 12.11.2013


Ответы (3)


Ответ содержится в вашем вопросе: STL означает "Стандартная библиотека шаблонов". Поскольку шаблоны находятся в файлах заголовков и создаются только тогда, когда они необходимы (например, используются), вы можете включить каждый отдельный заголовок STL (если хотите), и если бы вы не использовали ни один из них, ваш двоичный файл не был бы больше.

STL не является файлом .lib или .a, который необходимо связать. Это набор заголовочных файлов.

person Zac Howland    schedule 12.11.2013

Шаблоны всегда создаются по мере необходимости, и их экземпляры, адаптированные к используемым объектам, являются частью результирующего двоичного файла.

Остальная часть STL, не основанная на шаблонах, может быть связана статически или динамически в зависимости от настроек вашего компилятора.

person Erbureth says Reinstate Monica    schedule 12.11.2013

Частично динамически, частично статически:

  • статически связать все экземпляры шаблона (явные или неявные)
  • другие вещи связываются динамически

Этот простой пример:

#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
person BЈовић    schedule 12.11.2013