Установите LINK_FLAGS для библиотек INTERFACE в cmake

Я работаю над библиотекой C ++ 11 только для заголовков, которая использует современный CMake. Под «современным» я имею в виду не только использование CMake v3.0+ но также стараюсь использовать как можно больше лучших практик Даниэля Пфайфера говорить.

Я провел некоторое исследование по моему вопросу, но ответы в основном касаются изменения LINK_FLAGS непосредственно на глобальном уровне, который я не хочу иметь. Прямо сейчас в моем проекте мне требуется минимальная версия 3.9.0 CMake из-за некоторых функций, которые я использую.

Мой вопрос о том, / ли добавить LINK_FLAGS исходя из двух моих зависимостей: BLAS и LAPACK. По сути, у меня есть следующая выдержка из моего CMakeLists.txt файл:

cmake_minimum_required(VERSION 3.9.0)

project(polo VERSION 1.0.0 LANGUAGES C CXX)

find_package(BLAS REQUIRED)
find_package(LAPACK REQUIRED)

add_library(polo INTERFACE)
add_library(polo::polo ALIAS polo)

target_compile_features(polo INTERFACE cxx_std_11)

target_include_directories(polo
INTERFACE
$<BUILD_INTERFACE:${polo_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)

target_link_libraries(polo
INTERFACE
${BLAS_LIBRARIES}
${LAPACK_LIBRARIES}
)

set_property(
TARGET
polo
PROPERTY LINK_FLAGS
${BLAS_LINKER_FLAGS}
${LAPACK_LINKER_FLAGS}
)

Насколько я могу понять из документации FindBLAS а также FindLAPACK модули, я должен информировать своих пользователей по крайней мере о {BLAS,LAPACK}_LIBRARIES а также {BLAS,LAPACK}_LINKER_FLAGS, Для первого, я думаю, я справился с проблемой правильно. Тем не менее, для последнего мне нужно использовать либо set_target_properties или же set_property. Между этими двумя, последнее, кажется, дает мне более чистое решение в том смысле, что я могу использовать обе переменные из Find{BLAS,LAPACK} модули вместе. Когда я пытаюсь собрать свою библиотеку, используя вышеуказанное решение, я получаю очевидную ошибку:

CMake Error at src/CMakeLists.txt:32 (set_property):
INTERFACE_LIBRARY targets may only have whitelisted properties.  The
property "LINK_FLAGS" is not allowed.

У меня вопрос в два раза:

  1. Должен ли я использовать *_LINKER_FLAGS исходя из модулей вообще, и,
  2. Если да, то как мне их аккуратно интегрировать в мой проект CMake?

Что касается 2. выше, я видел несколько предложений / ответов по использованию target_link_libraries, но я не уверен, что это вариант.

Спасибо за ваше время!

1

Решение

Прежде всего, я прошу прощения у сообщества за кросс-постинг проблема.

Матье попытался помочь мне с двумя вариантами:

  1. Предоставление вспомогательной функции, чтобы потребители библиотеки могли вызывать функцию для правильной обработки LINK_FLAGS, а также,
  2. IMPORTED вариант библиотеки, который он сохранил в качестве окончательного ответа (см. комментарии там для мотивации).

К сожалению, ни одно из этих решений не работает. Первый — не чистый способ информировать потребителя о ваших зависимостях. Вторая версия, кажется, работает с INTERFACE библиотеки, но любой потребитель, который зависит от INTERFACE библиотека, которая создает объект, такая как, например, C-API библиотеки только для заголовка, которая создает SHARED библиотека, имеет проблемы со сборкой и установкой IMPORTED библиотека.

Решение, похоже, заключается в использовании CMake v3.13 и выше, который на дату публикации находится в кандидате на выпуск (rc3) государство. По-видимому, CMake v3.13 будет представлять INTERFACE_LINK_OPTIONS для таких целей.

РЕДАКТИРОВАТЬ. CMake v3.13 был вышел.

1

Другие решения

Приятно то, что вы можете предоставить им вспомогательный .cmake (называемый polo-config.cmake).

Один из вариантов в файле .cmake — создать IMPORTED библиотека, которые вы держите флаги, которые вы хотите, вероятно, как PUBLIC на этот раз, чтобы они были переданы следующему пользователю.

Конечно, вам нужно правильно добавить библиотеку, настроить пути включения, путь к библиотеке …

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector