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
相关产品推荐
相关产品推荐

