Я работаю над библиотекой 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
исходя из модулей вообще, и,Что касается 2. выше, я видел несколько предложений / ответов по использованию target_link_libraries
, но я не уверен, что это вариант.
Спасибо за ваше время!
Прежде всего, я прошу прощения у сообщества за кросс-постинг проблема.
Матье попытался помочь мне с двумя вариантами:
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
на этот раз, чтобы они были переданы следующему пользователю.
Конечно, вам нужно правильно добавить библиотеку, настроить пути включения, путь к библиотеке …