包括在子项目中

时间:2018-07-24 23:32:20

标签: c++ cmake

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

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>

projectA / CMakeLists.txt 中,我包含了projectB及其所有包含的内容,如下所示:

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

如果我没有包括projectB使用的所有库目录,那么我将无法编译,因为编译器无法找到boost。 (我看到一条错误消息:boost/algorithm/string.hpp: No such file or directory

是否有一个更简单的过程来使projectA从projectB导入所有包含项并更改路径以反映此项目层次结构?

1 个答案:

答案 0 :(得分:2)

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

假设projectAprojectA/CMakeLists.txt中定义的静态或共享库,如下所示,其中projectA_SOURCES是该库的所有源文件(即非头文件)的列表。 / p>

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/CMakeLists.txt(无关紧要的是库还是可执行文件)之后的projectB中:

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)