You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake 3.21的install()命令变更对其常规使用有哪些影响?

CMake 3.21+ 安装导出功能适配方案

使用CMake进行安装一直是较为复杂的过程,涉及多次命令调用以及版本文件、导出集等概念。CMake 3.21对install()命令、IMPORTED_TARGETS参数做了多处更新,大幅简化了依赖导出相关的流程,可按照以下三个维度调整适配:

1. 项目CMakeLists.txt修改

  • 首先声明最低支持的CMake版本为3.21,在文件顶部添加:
    cmake_minimum_required(VERSION 3.21 FATAL_ERROR)
    
    如果需要兼容低于3.21的CMake版本,可以加版本判断分支,分别写新旧两套安装逻辑。
  • 合并目标安装与导出逻辑:过去需要分开调用install(TARGETS)安装目标、install(EXPORT)导出目标配置,现在可以直接在install(TARGETS)中通过EXPORT参数绑定导出集,还支持通过IMPORTED_TARGETS参数直接将项目依赖的外部导入目标一同纳入导出集,不需要额外编写依赖目标的导出逻辑,示例如下:
    # 3.21+ 写法,同时安装原生目标和导出依赖的导入目标
    install(TARGETS my_core_lib my_tool
            EXPORT my_proj_export
            RUNTIME DESTINATION bin
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib
            INCLUDES DESTINATION include
            IMPORTED_TARGETS third_party::dep_lib
    )
    # 仅需要一次导出配置生成命令
    install(EXPORT my_proj_export
            FILE MyProjTargets.cmake
            NAMESPACE MyProj::
            DESTINATION lib/cmake/MyProj
    )
    
  • 版本文件生成可以直接使用write_basic_package_version_file()的新增兼容性规则,比如SameMinorVersion、ExactVersion等,不需要手动编写版本兼容校验逻辑。

2. 项目配置文件调整

  • 移除冗余的依赖查找代码:过去需要在MyProjConfig.cmake中手动调用find_dependency()声明所有依赖,现在如果通过IMPORTED_TARGETS导出了依赖目标,生成的MyProjTargets.cmake会自动携带依赖的目标配置,仅需要保留顶层依赖的查找逻辑即可。
  • 不需要手动设置导出目标的接口属性:install(TARGETS)中指定的INCLUDES DESTINATION会自动将安装后的头文件路径写入导出目标的INTERFACE_INCLUDE_DIRECTORIES属性,不需要额外调用set_target_properties()配置。

3. 下游使用说明调整

  • 明确告知使用该项目的开发者,最低要求CMake版本为3.21,版本不满足的需要升级CMake版本,或者引导其使用兼容旧版本的项目分支。
  • 下游开发者仅需要通过find_package(MyProj REQUIRED)引入项目,直接链接命名空间下的目标(如MyProj::my_core_lib)即可自动获得所有依赖的头文件、链接库配置,不需要手动处理该项目的第三方依赖。

内容的提问来源于stack exchange,提问作者einpoklum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:42:02