Я работаю над библиотекой C ++ 11 только для заголовков, которая использует современный CMake. Под «современным» я подразумеваю не только использование CMake v3.0+
, но и попытку использовать как можно больше лучших практик Даниэля Пфайфера talk .
Я провел некоторое исследование по моему вопросу, но ответы в основном касаются изменения 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
, но я не уверен, подходит ли этот вариант.
Спасибо, что уделили время!