我正在开发一个仅使用现代 CMake 的标头 C++11 库。所谓“现代”,我指的不仅是使用 CMake v3.0+
,而且还尝试尽可能多地使用 Daniel Pfeifer演讲中的最佳实践。
我已经对我的问题进行了一些研究,但答案主要是关于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
or 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
,但我不确定这是否是选择。
感谢您的时间!