Установите 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.
У меня вопрос в два раза:
- Должен ли я использовать
*_LINKER_FLAGS
исходя из модулей вообще, и, - Если да, то как мне их аккуратно интегрировать в мой проект CMake?
Что касается 2. выше, я видел несколько предложений / ответов по использованию target_link_libraries
, но я не уверен, что это вариант для.
Спасибо за ваше время!
2 ответа
Прежде всего, я прошу прощения у сообщества за перекрестную публикацию вопроса.
Матье попытался помочь мне с двумя вариантами:
- Предоставление вспомогательной функции, чтобы потребители библиотеки могли вызывать функцию для правильной обработки
LINK_FLAGS
, а также, IMPORTED
вариант библиотеки, который он сохранил в качестве окончательного ответа (см. комментарии там для мотивации).
К сожалению, ни одно из этих решений не работает. Первый - не чистый способ информировать потребителя о ваших зависимостях. Вторая версия, кажется, работает с INTERFACE
библиотеки, но любой потребитель, который зависит от INTERFACE
библиотека, которая создает объект, такой как, например, C-API библиотеки только заголовка, которая создает SHARED
библиотека, имеет проблемы со сборкой и установкой IMPORTED
библиотека.
Решение, похоже, заключается в использовании CMake v3.13
и выше, который на дату публикации находится в кандидате на выпуск (rc3
) государство. Видимо, CMake v3.13
будет представлять INTERFACE_LINK_OPTIONS
для таких целей.
РЕДАКТИРОВАТЬ. CMake v3.13
был выпущен.
Приятно то, что вы можете предоставить им вспомогательный.cmake (называемый polo-config.cmake
).
Один из вариантов в файле.cmake - создать IMPORTED
библиотека, в которой вы держите нужные флаги, вероятно, как PUBLIC
на этот раз, чтобы они были переданы следующему пользователю.
Конечно, вам нужно правильно добавить библиотеку, настроить пути включения, путь к библиотеке...