Что на самом деле делает статическое связывание с библиотекой? - PullRequest
4 голосов
/ 03 июня 2010

Скажем, у меня была библиотека с именем libfoo, которая содержала класс, несколько статических переменных, возможно что-то со связью 'C' и несколько других функций.

Теперь у меня есть основная программа, которая выглядит так:

int main() {
   return 5+5;
}

Когда я компилирую и связываю это, я связываюсь с libfoo.

Будет ли это иметь какой-либо эффект? Мой исполняемый файл увеличится в размере? Если так, то почему? Статические переменные или их адреса копируются в мой исполняемый файл?

Извиняюсь, если есть схожий вопрос с этим, или если я каким-то образом особенно глуп.

Ответы [ 2 ]

6 голосов
/ 03 июня 2010

В современном компоновщике ничего не получится, потому что он знает, что исполняемый файл на самом деле не использует символы libfoo. С gcc 4.4.1 и ld 2.20 в моей системе:

g++ linker_test.cpp -static -liberty -lm -lz -lXp -lXpm -o linker_test_unnecessary
g++ linker_test.cpp -static -o linker_test_none
ls -l linker_test_unnecessary linker_test_none 

Они оба 626094 байта. Обратите внимание, что это также относится к динамическому связыванию, хотя размер, который они оба имеют, намного меньше.

4 голосов
/ 03 июня 2010

Библиотека содержит ранее скомпилированный объектный код - в основном статическая библиотека представляет собой архив файлов .o или .obj.

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

Таким образом, только те части статической библиотеки, которые необходимы, включены в ваш исполняемый файл.

Таким образом, в вашем случае ничего из libfoo не будет добавлено в ваш исполняемый файл

...