CMake项目中如何仅引入指定头文件并使用根相对路径
CMake配置解决方案:仅引入指定头文件并保留根相对路径引用
问题场景
仓库结构:
root | |--- blocks | | | |---example | | | |---example.cpp | |---CMakeLists.txt | |--- interfaces | |--- types | |-- types1.h |-- types2.h |-- CMakeLists.txt
需求:
example.cpp中使用根相对路径#include "interfaces/types/types1.h"引用头文件- 编译目标
exampleblock仅能访问types1.h,不能暴露types目录下其他头文件 - 禁止使用
include_directories(${CMAKE_SOURCE_DIR})暴露整个仓库,也不移动头文件位置
当前编译错误:fatal error: interfaces/types/types1.h: No such file or directory
可行修改方案
1. 修改interfaces/types/CMakeLists.txt
cmake_minimum_required(VERSION 3.10) add_library(interface_types INTERFACE) # 设置包含目录为仓库根目录,满足根相对路径的#include引用 target_include_directories(interface_types INTERFACE ${CMAKE_SOURCE_DIR}) # 仅导出需要的types1.h,避免暴露types目录下其他无关头文件 target_sources(interface_types INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/types1.h )
2. 修改blocks/example/CMakeLists.txt
cmake_minimum_required(VERSION 3.10) add_library(exampleblock STATIC example.cpp ) # 正确链接interface_types目标(需确保根CMakeLists已添加该子目录) target_link_libraries(exampleblock PRIVATE interface_types)
3. 根目录CMakeLists.txt补充(若未配置)
确保根CMakeLists中包含子目录:
cmake_minimum_required(VERSION 3.10) project(YourProjectName) add_subdirectory(interfaces/types) add_subdirectory(blocks/example)
方案说明
- 通过
target_include_directories设置仓库根目录为INTERFACE包含路径,让#include "interfaces/types/types1.h"能正确定位文件,但不会直接暴露整个仓库的所有文件 - 利用
target_sources的INTERFACE参数,仅将types1.h标记为接口的一部分,其他头文件(如types2.h)不会被exampleblock或其他链接interface_types的目标访问到 - 修正了原配置中
target_link_libraries的语法错误,使用目标名直接链接,并根据静态库的使用场景选择PRIVATE链接属性
内容的提问来源于stack exchange,提问作者kaanyilmaz
相关产品推荐
相关产品推荐

