Я провел некоторое исследование и, хотя я не смог найти удовлетворительное решение проблемы, я нашел половину решения.
Проблема статических сборок сводится к 3 вещам:
Сборка и компоновка внутренних библиотек проекта.
Довольно просто, нужно просто переключить переключатель BUILD_SHARED_LIBS
OFF
.
Поиск статических версий внешних библиотек.
Единственный способ, по-видимому, - установить CMAKE_FIND_LIBRARY_SUFFIXES
так, чтобы он содержал нужный суффикс (ы) файла (это список приоритетов).
Это решение довольно "грязное" и оченьпротив кроссплатформенных устремлений CMake.ИМХО, это должно быть обработано за кулисами CMake, но, насколько я понял, из-за путаницы ".lib" в Windows кажется, что разработчики CMake предпочитают текущую реализацию.
Статическое связывание с системными библиотеками.
CMake предоставляет опцию LINK_SEARCH_END_STATIC
, основанную на документации: «Завершить линию связи, чтобы использовать статические системные библиотеки».Казалось бы, это все, проблема решена.Однако, похоже, что текущая реализация не соответствует задаче.Если опция включена, CMake генерирует неявный вызов компоновщика со списком аргументов, который заканчивается параметрами, переданными компоновщику, включая -Wl,-Bstatic
.Однако этого недостаточно.Только указание компоновщику на статическую ссылку приводит к ошибке, в моем случае: /usr/bin/ld: cannot find -lgcc_s
.Не хватает также сообщения gcc о том, что нам нужно статическое связывание через аргумент -static
, который не , сгенерированный для вызова компоновщика CMake.Я думаю, что это ошибка, но мне пока не удалось получить подтверждение от разработчиков.
Наконец, я думаю, что все это может и должно сделать CMake за кулисами, ведь это не так сложно, за исключением того, что это невозможно в Windows - если это считается сложным ...