我正在尝试设置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_a
是library_b
实现的通用接口,最终会有更多的实现,所以在c.hpp
中我包含了a.hpp
头,并在c.cpp
实现中使用b.hpp
。
一切都配置得很好,但是当我开始编译时,我得到一个错误,即找不到a.hpp
文件。
如何让target_link_libraries(target_c INTERFACE target_b)
包含target_a
中的头文件?
1条答案
按热度按时间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
(它是PRIVATE
和INTERFACE
的组合)。有关详细信息,请参阅the
target_link_libraries()
command的参考文档。