我正在尝试设置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_a
是library_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
(这是PRIVATE
和INTERFACE
的组合)。
有关更多信息,请参见target_link_libraries()
命令的参考文档。