CMake's find_package с библиотеками только для заголовков - PullRequest
0 голосов
/ 01 октября 2019

Недавно я узнал, как использовать find_package в CMake, и заметил, что он работает только с предварительно скомпилированными библиотеками.

Эта строка работает как положено:

find_package(Boost COMPONENTS filesystem REQUIRED)

Если это такпозже я могу использовать что-то подобное:

target_link_libraries(target Boost::filesystem)

Использование интерфейсов позволяет очень легко связать все необходимые зависимости, необходимые для Boost.Filesystem. Но было бы замечательно иметь подобное решение для библиотек только для заголовков, таких как Boost.Asio (я знаю, что можно встроить его в отдельный объект, но в качестве примера я буду рассматривать его как библиотеку только для заголовков)

find_package(Boost COMPONENTS asio REQUIRED)
target_link_libraries(target Boost::asio)

И это не будет работать должным образом.

Реализация ASIO требует от нас связать pthread в UNIX-подобных системах, поэтому мы можем сказать, что эта библиотека имеет зависимость, которая является библиотекой потоков. Есть ли удобное решение использовать его так же, как Boost.Filesystem в CMake?

1 Ответ

1 голос
/ 02 октября 2019

Вы можете использовать find_package, чтобы найти зависимости только для заголовка, используя Boost::boost в качестве цели, см. FindBoost , то есть:

find_package(Boost COMPONENTS boost REQUIRED)
if(Boost_FOUND)
  target_include_directories(target ${Boost_INCLUDE_DIRS})
else()
  message(STATUS "Boost NOT Found !")
endif(Boost_FOUND)

Однако вы обнаружите, чтоBoost::asio - это только заголовок, но для него требуется Boost::system. Поэтому вам требуется:

find_package(Boost COMPONENTS system REQUIRED)
if(Boost_FOUND)
  target_include_directories(target ${Boost_INCLUDE_DIRS})
  target_link_libraries(target Boost::system)
else()
  message(STATUS "Boost NOT Found !")
endif(Boost_FOUND)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...