在target_include_directories中何时使用BUILD_INTERFACE与INSTALL_INTERFACE?
问题根源
你当前配置安装失效的核心原因是INTERFACE段直接使用了${CMAKE_SOURCE_DIR}/include这个本地构建环境的绝对路径,库安装到其他环境后该路径不存在,使用者自然无法正确找到头文件,刚好需要用你提到的两个生成器表达式拆分场景解决问题。
修复方案
第一步:调整target_include_directories配置
用生成器表达式拆分构建和安装场景的头文件路径,完全保留你之前的使用习惯:
target_include_directories(mylib PRIVATE ${CMAKE_SOURCE_DIR}/include/mylib INTERFACE # 构建阶段:使用本地源码树的头文件路径 $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include> # 安装阶段:使用相对于安装前缀的路径 $<INSTALL_INTERFACE:include> )
调整后依然满足你要的规范:
- 库内部源码可以直接
#include "公共头文件名.h",不需要加前缀 - 库的使用者必须通过
#include <mylib/公共头文件名.h>的方式引用,避免头文件冲突
第二步:补充安装规则
需要额外添加头文件和库目标的安装配置,确保安装时头文件会被拷贝到对应路径:
# 安装库目标,同时导出目标配置 install(TARGETS mylib EXPORT mylib-targets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION include ) # 安装头文件目录到安装前缀的include路径下 install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ DESTINATION include FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) # 导出CMake配置文件,方便使用者通过find_package引入 install(EXPORT mylib-targets FILE mylibConfig.cmake NAMESPACE mylib:: DESTINATION lib/cmake/mylib )
内容的提问来源于stack exchange,提问作者QuaternionsRock
相关产品推荐
相关产品推荐

