Модуль поиска Cmake для различения разделяемой или статической библиотеки - PullRequest
0 голосов
/ 01 июля 2018

У меня есть проект cmake c ++, который использует libCrypto ++. У меня есть модуль FindCryptoPP.cmake, размещенный здесь . Важные части:

find_library(CryptoPP_LIBRARY
  NAMES cryptopp
  DOC "CryptoPP library"
  NO_PACKAGE_ROOT_PATH
  PATHS "/usr/lib/x86_64-linux-gnu/"
)
...
add_library(CryptoPP::CryptoPP UNKNOWN IMPORTED)
set_target_properties(CryptoPP::CryptoPP PROPERTIES
    IMPORTED_LOCATION "${CryptoPP_LIBRARY}"
    INTERFACE_INCLUDE_DIRECTORIES "${CryptoPP_INCLUDE_DIR}")

И это прекрасно работает, находит файл статической библиотеки (* .a). Теперь я хотел бы создать отдельные цели CryptoPP :: CryptoPP-static и CryptoPP :: CryptoPP-shared. Необходимые файлы установлены (установка по умолчанию для Ubuntu):

  • / USR / Lib / x86_64-Linux-гну / libcryptopp.a
  • / USR / Библиотека / x86_64-Linux-ГНУ / libcryptopp.so

Я хочу знать, как указать find_library для поиска в статической или совместно используемой версии (желательно в переносном режиме - мне нужны все Linux, Windows, MacOS) и указать тип созданной цели.

1 Ответ

0 голосов
/ 01 июля 2018

На самом деле по умолчанию CMake ищет сначала общие библиотеки, а затем статические библиотеки.

Ключ - это порядок значений в глобальной переменной CMAKE_FIND_LIBRARY_SUFFIXES, например: установите в CMakeGenericSystem.cmake как часть обнаружения компилятором / платформой CMake команды project() значение:

set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a")

Для решения взгляните на существующий модуль поиска, например FindBoost.cmake:

# Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
if( Boost_USE_STATIC_LIBS )
  set( _boost_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  if(WIN32)
    list(INSERT CMAKE_FIND_LIBRARY_SUFFIXES 0 .lib .a)
  else()
    set(CMAKE_FIND_LIBRARY_SUFFIXES .a)
  endif()
endif()

Здесь переменная CMAKE_FIND_LIBRARY_SUFFIXES временно изменяется для вызовов find_library().

То же самое должно быть применимо здесь. Просто имейте в виду, что find_library() кэширует свои результаты, если вы хотите выполнить один и тот же поиск дважды.

Ссылки

...