CMake链接自定义库时如何实现<mylibrary/mylibrary.h>形式引入头文件
解决方法
完全可以通过CMake配置实现该需求,无需修改现有源码目录结构,这里提供两种适配不同CMake版本的方案:
方案1:兼容CMake 3.20及以上(适配你当前的最低版本要求)
核心思路是在构建目录自动生成符合包含路径要求的头文件结构,再将对应目录公开给依赖项目。
修改后的CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 3.20) set(CMAKE_CXX_STANDARD 23) project(mylibrary) add_library(mylibrary src/mylibrary.h src/mylibrary.cpp) # 生成构建目录下的mylibrary头文件目录 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mylibrary) # 构建时自动同步最新的头文件到对应目录 add_custom_command( TARGET mylibrary PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/src/mylibrary.h ${CMAKE_CURRENT_BINARY_DIR}/mylibrary/mylibrary.h DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/mylibrary.h ) # 公开构建目录为头文件搜索根目录,替换原有的src目录配置 target_include_directories(mylibrary PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> $<INSTALL_INTERFACE:include> ) # 如果需要安装库,添加以下安装配置 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mylibrary/mylibrary.h DESTINATION include/mylibrary )
配置完成后,依赖项目就可以直接用#include <mylibrary/mylibrary.h>引入头文件。
方案2:CMake 3.23及以上版本,使用FILE_SET特性更规范
CMake 3.23新增的FILE_SET可以直接自定义头文件的包含路径前缀,无需手动复制文件,配置更简洁:
cmake_minimum_required(VERSION 3.23) set(CMAKE_CXX_STANDARD 23) project(mylibrary) add_library(mylibrary src/mylibrary.cpp) # 配置头文件路径映射 target_sources(mylibrary PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/src FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/mylibrary.h PREFIX "mylibrary" # 自动为头文件添加mylibrary/的路径前缀 ) # 可选安装配置 install(TARGETS mylibrary FILE_SET HEADERS DESTINATION include )
内容的提问来源于stack exchange,提问作者Basaa
相关产品推荐
相关产品推荐

