如何通过CMake实现以`common/Common.h`形式引用C++头文件?
解决方案:实现以src为根目录的头文件引用
要实现#include "common/Common.h"这种清晰的路径引用,核心是将src目录添加为编译目标的包含目录,让编译器从src开始查找头文件。以下是针对你两种现有CMake配置的修改方案,以及更规范的现代CMake写法:
方案1:针对单CMakeLists.txt的项目结构
如果你用的是第一种直接在src/CMakeLists.txt中添加所有文件的配置,只需在原有配置中添加一行设置包含目录的代码:
修改后的src/CMakeLists.txt:
# ... 原有CMake模板代码 ... add_executable(GUI common/Common.h gui/MainWindow.h gui/MainWindow.cpp ) # 关键:将当前CMakeLists.txt所在的src目录设为目标的私有包含目录 target_include_directories(GUI PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
说明
${CMAKE_CURRENT_SOURCE_DIR}会自动指向当前CMakeLists.txt所在的src目录,编译器查找头文件时会从这里开始,因此MainWindow.h中可以直接用#include "common/Common.h"引用目标文件。
方案2:针对带子目录库的项目结构
如果你用的是第二种将common拆分为子目录库的配置,同样只需在主CMakeLists.txt中添加包含目录设置:
修改后的src/CMakeLists.txt:
# ... 原有CMake模板代码 ... add_executable(GUI gui/MainWindow.cpp) add_subdirectory(common) target_link_libraries(GUI PRIVATE GUICommon) # 关键:将src目录设为GUI目标的私有包含目录 target_include_directories(GUI PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
更规范的现代CMake写法(推荐)
如果希望依赖库自动传递包含目录,无需在主目标中重复设置,可以修改子目录的CMake配置:
src/common/CMakeLists.txt修改为:
# 因为只有头文件,使用INTERFACE库更轻量 add_library(GUICommon INTERFACE) # 将src目录设为INTERFACE包含目录,依赖该库的目标会自动继承此设置 target_include_directories(GUICommon INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/..)
此时主src/CMakeLists.txt无需额外添加target_include_directories,只需保持原有的链接配置即可,GUI目标会通过链接GUICommon自动获得src目录作为包含目录。
验证
修改完成后,在MainWindow.h中使用:
#include "common/Common.h"
即可正确引用src/common/Common.h,同时避免了../或直接文件名的模糊引用。
内容的提问来源于stack exchange,提问作者Whimax07
相关产品推荐
相关产品推荐

