2

我正在开发一个仅使用现代 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}
)

据我从FindBLASFindLAPACK模块的文档中了解到,我需要至少通知我的用户有关{BLAS,LAPACK}_LIBRARIES{BLAS,LAPACK}_LINKER_FLAGS. 对于前者,我认为我已经妥善处理了这个问题。但是,对于后者,我需要使用set_target_propertiesor 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,但我不确定这是否是选择。

感谢您的时间!

4

2 回答 2

2

首先,对于交叉发布该问题,我向社区道歉。

Matthieu 尝试帮助我提供两种选择:

  1. 提供一个辅助函数,以便库的使用者可以调用该函数来正确处理LINK_FLAGS, 和,
  2. IMPORTED图书馆选项,他将其保留为最终答案(请参阅那里的评论以获取动机)。

Unfortunately, neither of these solutions seem to work. The first one is not a clean way of informing the consumer about your dependencies. The second version seems to work with INTERFACE libraries, but any consumer that depends on the INTERFACE library that build an object, such as, e.g., a C-API of the header-only library that builds a SHARED library, has problems building and installing the IMPORTED library.

The solution seems to be to use CMake v3.13 and above, which, as of the posting date, is in the release candidate (rc3) state. Apparently, CMake v3.13 will be introducing INTERFACE_LINK_OPTIONS for such purposes.

EDIT. CMake v3.13 has been released.

于 2018-11-19T20:16:22.730 回答
0

好消息是您可以为他们提供一个帮助程序 .cmake(称为polo-config.cmake)。

.cmake 文件中的一个选项是创建一个IMPORTEDlibrary,您可以在其中保存所需的标志,可能就像PUBLIC这次一样,以便将它们传播给下一个用户。

当然,您需要正确添加库,设置包含路径,库的路径......

于 2018-11-19T14:20:55.847 回答