Cmake从仅标头目标包含仅标头目标

yhxst69z  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(136)

我正在尝试设置cmake,这样我就可以有一个依赖于另一个头文件库的头文件库。我的目录结构看起来像这样。

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

我的CMakeLists.txt设置如下
目录根:

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中的头文件?

nkoocmlb

nkoocmlb1#

(As已经在注解中提到过),问题是你的非仅头文件库目标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的组合)。
有关详细信息,请参阅the target_link_libraries() command的参考文档。

相关问题