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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:20