Как найти статическую версию zlib в CMake? - PullRequest
0 голосов
/ 11 октября 2019

Я использую cmake версии 3.12.1 и хочу создать статический исполняемый файл, использующий ZLIB. У меня есть как статические (libz.a), так и общие (libz.so) библиотеки на моей машине. Как я могу сказать find_package(ZLIB) вернуть статическую версию? Может быть, есть и другой способ найти libz.a?

Мой нынешний способ это указать:

SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")

Тогда:

target_link_libraries (my_binary z lib1 lib2)

Критика этого подхода также приветствуется!

1 Ответ

2 голосов
/ 11 октября 2019

Ваш подход действителен, учитывая ограничения модуля CMake, называемого find_package(ZLIB), в частности FindZLIB.cmake. В то время как другие модули FindXXX.cmake имеют специальную опцию для захвата статических библиотек, модуль zlib не имеет.

На SO уже есть несколько вопросов по этой теме, но некоторые старше, чем другие, поэтому есть несколько вариантов.

Вместо этого вы можете применить флаг -static на более детальном уровне (вместо редактирования глобальной переменной CMAKE_EXE_LINKER_FLAGS), добавив его к вашему вызову target_link_libraries. Таким образом, он будет применяться только к этой цели - полезно, если вы создаете другие нестатические цели.

Вы также можете указать CMake явно искать статические библиотеки, установив CMAKE_FIND_LIBRARY_SUFFIXES,Когда вызывается find_package, CMake может искать библиотеки, заканчивающиеся на .a, используя это:

SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
find_package(ZLIB REQUIRED) 
...