2010-06-03 2 views
4

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

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

int main() { 
    return 5+5; 
} 

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

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

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

ответ

6

Он не будет ничего делать в современном компоновщике, поскольку он знает, что исполняемый файл фактически не использует символы 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

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

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

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

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

Смежные вопросы