Cmake, как собрать готовую библиотеку со статической линковкой (т.е. статически слинковать все внешние зависимости этой библиотеки сразу в неё)?

Рейтинг: 0Ответов: 1Опубликовано: 21.04.2023

Есть проект, куда все внешние либы линкуются статически (на таргет машинах нет возможности распространять новые версии этих либ). Сейчас необходимо обновить google protobuf. В новой версии этой библиотеки они полностью перешли на cmake и добавили новые внешние зависимости, такие как absl. После сборки и установки google protobuf на build машине проект со статической линковкой не собирается т.к. линковщик не может найти функции библиотеки absl внутри a'шников протобафа. Как мне в процессе сборки protobuf, заставить cmake линковать все зависимости в a'шники протобафа статически?

cmake -Dprotobuf_BUILD_TESTS=OFF .
cmake --build . -j12 --clean-first
sudo cmake --install .

Такими командами собираю протобаф. Какой флаг мне нужно добавить, чтобы линковщик собрал всё статически т.е. не оставлял в а файлах протобафа никаких внешних ссылок?

  • Система сборки проекта тоже cmake.
  • Build машина: Ubuntu 22.04
  • Target машина: Debian.
  • Cmake 3.22
  • GCC-12

P.S. После установки протобафа в систему сами a'шники absl лежат в каталоге протобафа. Возможно имеет смысл подхватить их. Но у меня так и не получилось сделать это из cmake скрипта моего проекта.

Ответы

▲ 1

Смотрите документацию/CMakeLists.txt файл собираемой библиотеки. Обычно в CMake, если опустить тип сборки (add_library(my_lib) vs add_library(my_lib SHARED)), таргет будет собираться статически, а с помощью флага -D BUILD_SHARED_LIBS можно вызвать динамическую сборку, ничего не меняя в CMakeLists.txt. Так что если с вашими командами такого не происходит, то смотрите документацию, как сделано в искомой библиотеке, — может там наоборот есть флаг типа protobuf_BUILD_STATIC либо статическая сборка вообще не поддерживается.