我有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导入所有包含项并更改路径以反映此项目层次结构?
答案 0 :(得分:2)
对于现代CMake(即3.x),不建议再使用include_directories
。另一种方法是为每个目标定义包含目录,并具有适当的“可见性”。
假设projectA
是projectA/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)