Общие библиотеки - это файлы .so (или в Windows .dll, или в OS X .dylib). Весь код, относящийся к библиотеке, находится в этом файле, и на него ссылаются программы, использующие его во время выполнения. Программа, использующая общую библиотеку, ссылается только на код, который она использует в общей библиотеке.
Статические библиотеки - это файлы .a (или в Windows .lib). Весь код, относящийся к библиотеке, находится в этом файле, и он напрямую связан с программой во время компиляции. Программа, использующая статическую библиотеку, берет копии кода, который она использует, из статической библиотеки и делает ее частью программы. [В Windows также есть файлы .lib, которые используются для ссылки на файлы .dll, но они действуют так же, как и первый].
У каждого метода есть свои преимущества и недостатки.
Совместно используемые библиотеки уменьшают объем кода, который дублируется в каждой программе, использующей библиотеку, сохраняя размер двоичных файлов небольшим. Это также позволяет вам заменить общий объект функционально эквивалентным, но может иметь дополнительные преимущества в производительности без необходимости перекомпиляции программы, которая его использует. Совместно используемые библиотеки, однако, будут иметь небольшую дополнительную стоимость для выполнения функций, а также стоимость загрузки во время выполнения, поскольку все символы в библиотеке должны быть связаны с тем, что они используют. Кроме того, общие библиотеки могут быть загружены в приложение во время выполнения, что является общим механизмом для реализации бинарных подключаемых систем.
Статические библиотеки увеличивают общий размер двоичного файла, но это означает, что вам не нужно иметь при себе копию используемой библиотеки. Поскольку код подключен во время компиляции, никаких дополнительных затрат на загрузку во время выполнения не возникает. Код просто там.
Лично я предпочитаю разделяемые библиотеки, но использую статические библиотеки, когда необходимо убедиться, что двоичный файл не имеет много внешних зависимостей, которые могут быть трудно встретить, таких как конкретные версии стандартной библиотеки C ++ или конкретные версии Boost C ++ библиотека.