Первое, что нужно знать: никто не связывает статическую библиотеку - он использует архиватор (ar
в Linux), который просто помещает все объектные файлы в один архив - libXXX.a
Этоне очень обычно создавать статическую библиотеку из других статических библиотек, но не невозможно (хотя я не знаю, как это сделать с помощью cmake, но если все остальное терпит неудачу, у вас все еще есть add_custom_command
),
Предположим, у вас есть две статические библиотеки libA.a
и libB.a
и вы хотите объединить их в объединенную библиотеку libALL.a
.Самый простой способ - распаковать оба архива (помните, что статические библиотеки - это всего лишь архивы) и упаковать все распакованные объектные файлы в новую архивную / статическую библиотеку libALL.a
(см. справочные страницы ar
для получения дополнительной информации об используемых параметрах):
ar -x libA.a
ar -x libB.a
ar -crs libALL.a *.o
Другой возможностью будет использование mri-script для ar
, при его использовании мы будем избегать распаковки всехобъектные файлы лежат вокруг (и это более надежно, потому что не все объектные файлы имеют *.o
-extension):
ar -M <<EOM
CREATE libALL.a
ADDLIB libA.a
ADDLIB libB.a
SAVE
END
EOM
Некоторые люди запускали дополнительно
ar -s libALL.a
илиэквивалентно
ranlib libALL.a
для обеспечения создания индекса архива (это единственное, что отличает статическую библиотеку от простого архива), но это сборка по умолчанию.
Еще одинпримечание: интуитивно понятный (и более похожий на команду VisualS tudio lib.exe /OUT:libALL.lib libA.lib libB.lib
)
ar -crs libALL.a libA.a libB.a
не создает архив, который может использоваться компоновщиком - ar
ожидает объектные файлы и не является интеллектуальнымДостаточно заглянуть в архивы, чтобы найти их.
Общие библиотеки связаны между собой.Кроме того, разделяемым библиотекам требуется независимый от позиции код, это означает, что все объектные файлы должны быть скомпилированы с параметрами -fPIC
.
. Часто библиотека предоставляет две версии:
- статические, скомпилированные без
-fPIC
- расшаренный, скомпилированный с
-fPIC
Будучи скомпилированным без -fPIC
, статическая версия немного более эффективна.Это также гарантирует, что статическая библиотека не используется как зависимость в общей библиотеке, что может привести к нарушениям One Definition Rule .
Как правило, общие библиотеки должны зависетьв других общих библиотеках, а не в статических.
Очевидно, что вы можете перекомпилировать все свои статические библиотеки с помощью -fPIC
и связать их вместе в одну общую библиотеку - но я бы не рекомендовал это.