Cmake仅包括仅来自标头目标的标题目标



我正在尝试设置cmake,以便我只能拥有一个仅取决于另一个标头库的标头库。我的目录结构看起来像这样。

library_a
|_ a.hpp
library_b
|_ b.hpp
library_c
|_ c.hpp
|_ c.cpp

我的CMakeLists.txt设置如下

目录root:

add_subdirectory(library_a)
add_subdirectory(library_b)
add_subdirectory(library_c)

library_a目录

add_library(target_a INTERFACE)
target_sources(target_a INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/a.hpp>)
target_include_directories(target_a INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)

library_b目录

add_library(target_b INTERFACE)
target_sources(target_b INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/b.hpp>)
target_include_directories(target_b INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_link_library(target_b INTERFACE target_a)

library_c目录

add_library(target_c STATIC)
target_sources(korc_node_context
               PUBLIC    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/c.cpp>
               INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/c.hpp>)
target_include_directories(target_c INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>)
target_link_libraries(target_c INTERFACE target_b)

目标library_alibrary_b实现的通用接口。最终将有更多的实现。因此,在c.hpp中,我包括a.hpp标头,并在c.cpp实现中使用b.hpp

所有内容配置正常,但是当我进行编译时,我会发现找不到a.hpp文件的错误。

如何使target_link_libraries(target_c INTERFACE target_b)target_a中包括标题?

(如评论中已经提到的),问题是指定您的非库库目标 target_c,说其接口唯一的它的接口取决于您的仅标头target_b(并且在target_a上进行过渡时),当您的target_c 本身也取决于(或仅?)target_b

如果target_c的接口不依赖于target_a(通过target_b进行传输 - 即target_c的用户无需使用target_a接口中的任何内容),则在将target_b链接到target_c时使用PRIVATE。否则,使用PUBLIC(这是PRIVATEINTERFACE的组合)。

有关更多信息,请参见target_link_libraries()命令的参考文档。

最新更新