在一个项目中,我们使用ExternalProject_add
来管理常规第三方并推动其下载和构建过程(有些来自常规URL,有些来自git存储库)
最近,我遇到了添加一个额外的第三方的需求。到目前为止,它是我们仅有的仅有标头的第三方。对于那些感兴趣的人,它是kvasir_mpl
。
但是,当我尝试将target_link_libraries
与kvasir_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目标,从而迫使我们使用纯签名。
在这种情况下,有没有办法使普通签名有效?
答案 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 ++,并且不会在仅标头的库中扣除它。