CMake多子目录项目提示Elevator/Elevator.h无此文件或目录怎么解决?
报错的核心原因是Elevator库没有对外声明自身的头文件搜索路径:即使States模块通过target_link_libraries链接了Elevator库,CMake也不会自动把Elevator相关的路径加入到States的头文件搜索列表中。
方案1(符合CMake模块化规范的推荐方案)
修改Elevator目录下的CMakeLists.txt,给Elevator库添加对外公开的头文件包含路径:
set(elevator_source_files Elevator.cpp Elevator.h Set.cpp Set.h ) add_library(Elevator ${elevator_source_files}) # 新增下面这行即可 target_include_directories(Elevator PUBLIC ${CMAKE_CURRENT_LIST_DIR}/..)
这样所有链接了Elevator库的目标(包括States、最终的Test可执行文件),都会自动把项目根目录加入头文件搜索路径,#include "Elevator/Elevator.h"的写法就能正常匹配到文件。
这种方案的优势是职责清晰:Elevator库自己声明对外暴露的头文件路径,所有依赖它的模块不需要额外配置路径,自动继承配置。
方案2(你当前已生效的调整方案)
你当前在States的CMakeLists.txt中添加target_include_directories(States PUBLIC ${CMAKE_CURRENT_LIST_DIR}/..)的配置也能解决问题,本质是手动把项目根目录加入States的头文件搜索路径,缺点是如果后续有其他模块也需要引用Elevator的头文件,需要每个模块都单独加路径配置,维护成本更高。
根目录CMakeLists.txt中的C++标准配置变量名存在笔误,正确的变量名是CMAKE_CXX_STANDARD和CMAKE_CXX_STANDARD_REQUIRED,你当前写的CMAKE_CPP_STANDARD是无效配置,建议修改为:
set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)
避免后续出现C++标准不生效的问题。
内容的提问来源于stack exchange,提问作者Mercrist

