在CMake中的不同子目录中添加include目录



我有一个CMake项目,它的结构如下:

project-root
|-external
| |-CMakeLists.txt
| |-libA
|   |-include
|     |-a.h
|-src
| |-CMakeLists.txt
| |-partX
|   |-CMakeLists.txt
|   |-X.cpp
|   |-X.h
|-CMakeLists.txt

项目root/CMakeLists.txt:

cmake-minimum-required(VERSION 3.19.2)
project(myProject)
add_subdirectory(external)
add_subdirectory(src)

external/CMakeLists.txt:

include_directories(libA/include)

src/CMakeLists.txt:

add_subdirectory(partX)

partX/CMakeLists.txt:

add_library(X X.cpp X.h)

问题是,在链接时,X.cpp无法找到.h为什么会发生这种情况,我该如何解决?

Never在新代码中使用include_directories。使用target_include_directoriestarget_link_libraries来声明包含路径和依赖项。这包括更新两个文件:

# ./external/CMakeLists.txt
add_library(libA INTERFACE)
# IMPORTANT
target_include_directories(libA INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/libA/include")
# ./src/partX/CMakeLists.txt
add_library(X X.cpp X.h)
# IMPORTANT
# If X uses symbols from libA in its API, replace PRIVATE with PUBLIC below.
target_link_libraries(X PRIVATE libA)

这里的重要部分是:

  1. 我们将libA建模为INTERFACE
  2. 我们可以通过target_include_directories(libA INTERFACE ...)命令指定链接到libA的目标需要查看libA的包含路径
  3. 为了获得正确的包含路径,我们将libA链接到X

最新更新