Лекция 5, часть вторая. Библиотеки в C++

О разнице между динамическими и статическими библиотеками

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

Например:

gcc -c file.c
gcc file.o -o file

(первая команда даст file.o, вторая — исполняемый файл). На втором этапе подключается библиотека libc. При этом gcc выбирает компилятор по расширению файла (например, gcc -c file.pas и gcc -c file.cpp вызовут разные компиляторы). Однако по умолчанию подключается только библиотека libc. Если сказать

gcc file.o -l stdc++ -o file

подключится ещё и библиотека stdc++.

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

g++ -c file.cpp
g++ file.o -o file

Библиотека stdc++ подключится сама. Она включает в себя все необходимые функции, что делает её автономной, но и сильно увеличивает размер программы.

Кроме статической, есть ещё динамическая линковка.

Динамическая библиотека языка — это библиотека, которая загружается в ОС по запросу работающей программы непосредственно в ходе её выполнения. Это делает линковщик, который собирает эту библиотеку из программных модулей, и загрузчик, который при запуске проверяет наличие этих модулей на компьютере. Такие библиотеки имеют другое расширение: .so в linux и .dll в win (в отличие от .a и .lib соответственно для статических).

Достоинства динамической линковки в том, что подключаемые библиотеки занимают меньше места, и, если мы делаем какие-нибудь обновления, то исполняемый файл перекомпилировать не нужно. (Недостатки в том, что для работы динамических библиотек необходимо их иметь. Кроме того, они могут отличаться версиями.)

По умолчанию все библиотеки .so и .dll собираются динамически. Если сказать

gcc file.o <библиотека> -o file -static

то данная библиотека при компиляции этого файла скомпилируется статически.