我有一个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_directories
和target_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)
这里的重要部分是:
- 我们将
libA
建模为INTERFACE
库 - 我们可以通过
target_include_directories(libA INTERFACE ...)
命令指定链接到libA
的目标需要查看libA
的包含路径 - 为了获得正确的包含路径,我们将
libA
链接到X