如何通过CMake实现Public/Private结构下头文件的非相对路径导入
CMake配置实现跨模块头文件导入与链接
完全可行,以下提供两种适配方案,满足你用#include <Core/example.h>导入目标头文件并完成库链接的需求:
方案一:调整目录结构(推荐,符合工程规范)
这是业内常规做法,将Core模块的公开头文件整理到以模块名命名的子目录下,目录结构调整为:
. ├── Core │ ├── Private │ │ └── example.cpp │ └── Public │ └── Core │ └── example.h └── Math ├── Private │ └── Math.cpp └── Public └── Math.h
根目录CMakeLists.txt配置
cmake_minimum_required(VERSION 3.10) project(YourProjectName) # 设置C++标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 编译Core静态库(可替换为SHARED生成动态库) add_library(Core STATIC Core/Private/example.cpp Core/Public/Core/example.h ) # 将Core/Public加入公开头文件搜索路径,依赖Core的目标会自动继承该路径 target_include_directories(Core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Core/Public ) # 编译Math静态库 add_library(Math STATIC Math/Private/Math.cpp Math/Public/Math.h ) # 让Math依赖Core,自动继承Core的头文件路径并完成链接 target_link_libraries(Math PRIVATE Core) # 若有可执行文件,添加以下配置(按需启用) # add_executable(Main main.cpp) # target_link_libraries(Main PRIVATE Core Math)
配置完成后,在Math/Private/Math.cpp中直接写#include <Core/example.h>即可引用目标头文件,库链接也会自动完成。
方案二:不调整现有目录结构(通过CMake转发头文件实现)
如果不想修改现有目录结构,可通过CMake自动生成转发头文件实现需求:
根目录CMakeLists.txt配置
cmake_minimum_required(VERSION 3.10) project(YourProjectName) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 在构建目录下创建Core目录,存放转发头文件 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Core) # 生成转发头文件Core/example.h,指向真实的Core/Public/example.h configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Core/Public/example.h ${CMAKE_CURRENT_BINARY_DIR}/Core/example.h COPYONLY ) # 编译Core静态库 add_library(Core STATIC Core/Private/example.cpp Core/Public/example.h ) target_include_directories(Core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/Core/Public ) # 编译Math静态库 add_library(Math STATIC Math/Private/Math.cpp Math/Public/Math.h ) # 将构建目录加入Math的头文件搜索路径,同时链接Core target_include_directories(Math PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ) target_link_libraries(Math PRIVATE Core) # 可执行文件配置(按需启用) # add_executable(Main main.cpp) # target_link_libraries(Main PRIVATE Core Math)
这种方式下,CMake会在构建目录自动生成Core/example.h,编译器搜索时会优先找到该文件,间接引用真实的Core/Public/example.h,同时完成库的链接。
核心原理说明
- 用
add_library将Core、Math模块化编译为库,便于依赖管理; target_include_directories的PUBLIC关键字,让依赖该库的目标自动继承头文件搜索路径,避免重复配置;target_link_libraries同时完成库依赖关系建立与编译后链接操作。
内容的提问来源于stack exchange,提问作者Fabian Oppermann
相关产品推荐
相关产品推荐

