You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中include_directories是否作用于add_subdirectory的所有目标?

问题

已知include_directories会作用于当前CMake文件内的所有目标,若在父CMakeLists.txt中先调用include_directories指定PATH1、PATH2,再调用add_subdirectory引入子目录,子目录CMakeLists.txt中的add_library等目标是否会继承父目录设置的包含路径?

回答

会继承。

include_directories设置的是全局包含路径,它会作用于当前CMake作用域,以及所有后续通过add_subdirectory引入的子作用域中的所有目标(包括add_library、add_executable创建的目标)。

举个简单示例:
父CMakeLists.txt内容:

cmake_minimum_required(VERSION 3.10)
project(ParentProject)

include_directories(PATH1 PATH2)
add_subdirectory(subdir)

子目录subdir下的CMakeLists.txt内容:

add_library(MyLib src/lib.cpp)

此时MyLib目标会自动将PATH1和PATH2纳入头文件搜索路径,无需在子目录中重复调用include_directories。

不过要注意,从CMake 3.11开始,官方更推荐使用目标级别的包含路径设置——target_include_directories,它仅作用于指定目标,能避免全局路径带来的潜在冲突,示例写法如下:
父CMakeLists.txt中针对子目录目标设置:

cmake_minimum_required(VERSION 3.11)
project(ParentProject)

add_subdirectory(subdir)
target_include_directories(MyLib PUBLIC PATH1 PATH2)

或者直接在子目录内为目标配置:

add_library(MyLib src/lib.cpp)
target_include_directories(MyLib PUBLIC ${PROJECT_SOURCE_DIR}/PATH1 ${PROJECT_SOURCE_DIR}/PATH2)

这种方式逻辑更清晰,也符合现代CMake的最佳实践。


内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:43:09