如何配置CMake将项目根目录纳入头文件包含路径
CMake配置问题:以项目根目录为起点包含头文件
我是新手,这是我的第一个提问。我在CLion中有一个C++项目,目录结构如下:
project-root/ ├─ cmake-build-debug/ ├─ controller/ ├─ model/ │ ├─ foo/ │ │ ├─ a.h * │ │ ├─ a.cpp * │ ├─ bar/ │ │ ├─ b.h * │ │ ├─ b.cpp * ├─ view/ │ ├─ c.h * │ ├─ c.cpp * ├─ new_file ├─ CMakeLists.txt ├─ main.cpp *
我希望在头文件中以项目根目录为起点进行包含,例如:
- 在a.h中使用
#include "project-root/model/bar/b.h"引入b.h - 在c.h中用
#include "project-root/model/foo/a.h"引入a.h - main.cpp中用
#include "project-root/view/c.h"引入c.h
我尝试了以下CMake配置:
cmake_minimum_required(VERSION 3.22) project(project-root) set(CMAKE_CXX_STANDARD 17) include_directories(..) add_executable(project-root main.cpp <the rest of all the .h and .cpp files>)
该配置能正常工作,但include_directories(..)使用项目根目录的上级路径,我认为不合理。而使用include_directories(.)时会出现头文件找不到的错误,请问正确的CMake配置方式是什么?
正确配置方案
满足你需求的配置
如果你坚持要保留project-root/前缀的包含方式,必须让编译器能定位到project-root目录,也就是把它的上级目录加入包含路径。推荐使用现代CMake的target_include_directories(替代全局的include_directories,作用范围更精准):
cmake_minimum_required(VERSION 3.22) project(project-root) set(CMAKE_CXX_STANDARD 17) # 获取项目根目录的上级目录 get_filename_component(PARENT_DIR ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY) # 添加所有需要编译的源文件 add_executable(project-root main.cpp model/foo/a.cpp model/bar/b.cpp view/c.cpp # 补充其他需要的源文件 ) # 将上级目录添加到目标的私有包含路径 target_include_directories(project-root PRIVATE ${PARENT_DIR})
为什么include_directories(.)会报错?
当配置include_directories(.)时,包含路径是project-root/,此时编译器会在这个路径下查找project-root/model/bar/b.h,对应的物理路径是project-root/project-root/model/bar/b.h,显然该路径不存在,因此会触发头文件找不到的错误。
更合理的常规写法
完全可以去掉project-root/前缀,直接以项目根目录为起点写包含语句,比如在a.h中写#include "model/bar/b.h",这样配置更简洁,也符合行业常规:
cmake_minimum_required(VERSION 3.22) project(project-root) set(CMAKE_CXX_STANDARD 17) add_executable(project-root main.cpp model/foo/a.cpp model/bar/b.cpp view/c.cpp # 补充其他需要的源文件 ) # 将项目根目录本身添加到包含路径 target_include_directories(project-root PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
这种写法不需要依赖上级目录,结构更清晰,也避免了不必要的路径层级。
内容的提问来源于stack exchange,提问作者that boy jenkins
相关产品推荐
相关产品推荐

