包括在子项目中

Include includes in subproject

本文关键字:子项目 包括      更新时间:2023-10-16

我有项目B作为项目a的子项目。两个项目都包含一个用于存储头库的include目录。文件夹结构如下:

projectA/CMakeLists.txt
projectA/A.cpp
projectA/include/projectB/CMakeLists.txt
projectA/include/projectB/B.h
projectA/include/projectB/include/boost
projectA/include/projectB/include/...

B.h内部,我正在使用Boost,所以包含行看起来像这样:

#include <boost/algorithm/string.hpp>

A.cpp中,我包括B.h.

#include <B.h>

项目A/CMakeLists.txt中,我包括项目B及其所有包含,如下所示:

include_directories(
include/projectB
include/projectB/include/boost 
include/projectB/include/...)

如果我没有包括projectB使用的所有库目录,我就无法编译,因为编译器找不到boost。(我得到一个错误,上面写着:boost/algorithm/string.hpp: No such file or directory(

有没有一个更简单的过程让projectA从projectB导入所有includes并更改路径以反映此项目层次结构?

对于现代CMake(即3.x(,不建议再使用include_directories。另一种选择是为每个目标定义具有适当"可见性"的包含目录。

假设projectA是如下在projectA/CMakeLists.txt中定义的静态或共享库,其中projectA_SOURCES是该库的所有源文件(即,不是头文件(的列表。

add_library(projectA ${projectA_SOURCES})
target_include_directories(projectA
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include/projectB/include
${CMAKE_CURRENT_LIST_DIR}/include/projectB/include/boost
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/projectB)

然后,在定义了目标projectB(作为库或可执行文件,这无关紧要(后的projectB/CMakeLists.txt中:

target_include_directories(projectB
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include/projectA/include
PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/projectA)
target_link_library(projectB
PUBLIC projectA)