从Buck迁移至CMake:如何实现头文件别名功能?
解决CMake中创建头文件别名的问题
原Buck脚本里的条件头文件别名逻辑,在CMake里可以通过以下几种方式实现——你之前尝试的set_source_files_properties/set_target_properties无法实现虚拟头文件映射,所以会出现文件未找到错误:
方法1:用configure_file生成映射头文件
这是跨平台兼容性最好的方案,通过生成中间头文件实现别名映射:
- 创建模板文件
Commheader.h.in,内容如下:
#include "@INCLUDE_HEADER@"
- 在CMakeLists.txt中添加逻辑,根据条件设置实际头文件名,再生成目标头文件:
# 根据条件指定实际要包含的头文件 if(someConditionTrue) set(INCLUDE_HEADER "TargetAHeader.h") else() set(INCLUDE_HEADER "TargetBHeader.h") endif() # 从模板生成Commheader.h,替换变量为实际头文件名 configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/Commheader.h.in ${CMAKE_CURRENT_BINARY_DIR}/Commheader.h COPYONLY ) # 将生成头文件的目录加入目标的包含路径 target_include_directories(你的目标名称 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
源码中#include "Commheader.h"时,实际会包含你指定的TargetAHeader.h或TargetBHeader.h。
方法2:创建符号链接(适合非Windows平台或允许符号链接的场景)
直接在编译目录创建符号链接,把Commheader.h指向实际的头文件:
if(someConditionTrue) set(REAL_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/TargetAHeader.h") else() set(REAL_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/TargetBHeader.h") endif() # 创建符号链接作为目标依赖 add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Commheader.h COMMAND ${CMAKE_COMMAND} -E create_symlink ${REAL_HEADER} ${CMAKE_CURRENT_BINARY_DIR}/Commheader.h DEPENDS ${REAL_HEADER} ) # 添加包含路径,并将符号链接文件加入目标源文件(确保构建时生成) target_include_directories(你的目标名称 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_sources(你的目标名称 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/Commheader.h)
方法3:用INTERFACE库封装头文件选择
如果TargetAHeader.h和TargetBHeader.h位于不同目录,可通过INTERFACE库统一管理包含路径:
add_library(comm_header_alias INTERFACE) if(someConditionTrue) # 将TargetA头文件所在目录加入INTERFACE库的包含路径 target_include_directories(comm_header_alias INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/target_a_dir) else() # 将TargetB头文件所在目录加入INTERFACE库的包含路径 target_include_directories(comm_header_alias INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/target_b_dir) endif() # 你的业务目标链接这个INTERFACE库 target_link_libraries(你的目标名称 PRIVATE comm_header_alias)
注:这种方法需要target_a_dir和target_b_dir下都有同名的Commheader.h(各自内部包含实际的TargetAHeader.h/TargetBHeader.h)。
内容的提问来源于stack exchange,提问作者Prathamesh Saraf
相关产品推荐
相关产品推荐

