gpt4 book ai didi

c++ - 如何使用 CMake 处理仅 header 的第三方?

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:39 25 4
gpt4 key购买 nike

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

最近,我发现需要添加一个额外的第三方。到目前为止,它是我们唯一拥有的仅 header 第三方。对于那些感兴趣的人,它是 kvasir_mpl .

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

[ 83%] Linking CXX executable app
/usr/bin/ld: cannot find -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 目标,这迫使我们使用普通签名。

在这种情况下有没有办法使普通签名起作用?

最佳答案

在 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 构建的库(接口(interface)),与该库链接时包含的目录是什么......您还可以添加额外的编译标志等。必须指定链接器语言,因为 CMake 希望知道它是 C 还是 C++,并且不会在仅包含头文件的库中扣除它。

关于c++ - 如何使用 CMake 处理仅 header 的第三方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58764931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com