如何使用CMake处理仅标头的第三方?

时间:2019-11-08 10:38:01

标签: c++ cmake linker

在一个项目中,我们使用ExternalProject_add来管理常规第三方并推动其下载和构建过程(有些来自常规URL,有些来自git存储库)

最近,我遇到了添加一个额外的第三方的需求。到目前为止,它是我们仅有的仅有标头的第三方。对于那些感兴趣的人,它是kvasir_mpl

但是,当我尝试将target_link_librarieskvasir_mpl一起使用时,CMake始终将其视为常规库,最终构建失败:

  

[83%]链接CXX可执行应用程序
  / usr / bin / ld:找不到-lkvasir_mpl

我设计了一个最小的示例来重现该问题:

./ CMakeLists.txt:

cmake_minimum_required( VERSION 3.7.0 )

project( Test CXX )

add_subdirectory( kvasir )
add_subdirectory( app )

./ app / CMakeLists.txt:

project( App CXX )

add_executable( app main.cpp )

target_link_libraries( app kvasir_mpl )

kvasirmpl / CMakeLists.txt:

cmake_minimum_required( VERSION 3.7.0 )

project( KvasirMpl )

include( ExternalProject )

ExternalProject_Add(
    3rdparty_kvasirmpl

    GIT_REPOSITORY https://github.com/kvasir-io/mpl
    GIT_TAG origin/development
    INSTALL_COMMAND ""
    BUILD_COMMAND "" )

请注意,如果我使用关键字签名target_link_libraries( app INTERFACE kvasir_mpl ),则可以解决我的问题。但是,在我们的实际用例中,target_link_libraries通过自定义CMake函数运行,并且可以将任何内容从常规库文件传递到CMake目标,从而迫使我们使用纯签名。

在这种情况下,有没有办法使普通签名有效?

1 个答案:

答案 0 :(得分:0)

在kvasirmpl / CMakeLists.txt中,添加以下行:

add_library(kvasir_mpl INTERFACE)
target_include_directories(kvasir_mpl PUBLIC <includedirs>)
set_target_properties(kvasir_mpl PROPERTIES LINKER_LANGUAGE CXX)

这告诉CMake有一个不是由CMake(接口)构建的库,与该库链接时包含目录是什么...您还可以添加额外的编译标志等。 必须指定链接器语言,因为CMake希望知道它是C还是C ++,并且不会在仅标头的库中扣除它。