C++-Cmake指令:cmake_minimum_required

2023-11-03

  • 命令格式

    cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])
    该命令指明了对cmake的最低(高)版本的要求,...为低版本和高版本之间的连接符号,没有其他含义。

  • 命令解析

  1. cmake版本号说明
    cmake的版本号格式为major.minor[.patch[.tweak]],例如cmake的版本号为3.10.2。
  2. 参数详解
    • VERSION:指明后面的参数为版本号,这个参数是必须的。
    • min:指定cmake要求的最低版本号,如果cmake实际版本号低于min指定的版本号,cmake的执行过程会终止。
    • max:指定cmake要求的最高版本号,要求该参数不能小于min。如果cmake是3.12之前的版本,...<max>会被忽略,按照min指定的版本参数运行,相当于cmake_minimum_required(VERSION <min>...3.12)
    • FATAL_ERROR: 该参数在cmake的2.6及以后的版本被忽略,在cmake的2.4及以前的版本,需要指明该参数,以便cmake能提示失败而不仅仅是一个警告。
  • 举例说明

    1. 假设当前的cmake版本为3.10.2

    >cmake --version
    cmake version 3.10.2
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

    示1.1:指定了min,且比当前cmake版本低

    # CMakeLists.txt文件
    cmake_minimum_required (VERSION 2.8.0)
    
    # 执行结果
    >cmake .
    -- Configuring done
    -- Generating done
    -- Build files have been written to:XXXXXX
    

    示例1.2:指定了min,且比当前的cmake版本高

    # CMakeLists.txt 文件
    cmake_minimum_required (VERSION 3.12.0)
    
    # 执行结果
    >cmake .
    CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
    CMake 3.12.0 or higher is required.  You are running version 3.10.2
    
    -- Configuring incomplete, errors occurred!
    

    示例1.3:指定了min,也指定了max实际上由于当前环境的cmake版本低于3.12,因此...max是会被忽略的

    # CMakeLists.txt 文件
    cmake_minimum_required (VERSION 3.10.0...3.12.0)
    
    # 执行结果
    >cmake .
    -- Configuring done
    -- Generating done
    -- Build files have been written to:XXXXXX
    

    2. 假设当前的cmake版本为3.18.2

    >cmake --version
    cmake version 3.18.2
    
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

      当只指定min的时候,结果和示例1.1、示例1.2一致。如果同时也指定了max,有如下几种情况:
    示2.1:指定了max,且比min版本低

    # CMakeLists.txt文件
    cmake_minimum_required (VERSION 3.12.2...3.10.2)
    
    # 执行结果,会提示错误
    >cmake .
    CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
    Policy VERSION range "3.12.2...3.10.2" specifies a larger minimum than
    maximum.
    

    示2.2:指定了max,高于min且比当前运行的cmake版本高

    # CMakeLists.txt文件
    cmake_minimum_required (VERSION 3.12.2...3.19.2)
    
    # 执行结果
    >cmake .
    -- Configuring done
    -- Generating done
    -- Build files have been written to:XXXXXX
    

    示2.3:指定了max,高于min且比当前运行的cmake版本低

    # CMakeLists.txt文件
    cmake_minimum_required (VERSION 3.12.2...3.16.2)
    
    # 执行结果
    >cmake .
    -- Configuring done
    -- Generating done
    -- Build files have been written to:XXXXXX
    

  可以看到,示例2.2和示例2.3在输出结果上没有什么区别,特别是实际运行的cmake版本比max高时,也是正常的,说明max并不是对当前运行的cmake最高版本的限制。实际上这里影响的是cmake版本的策略机制,这部分内容可以参考更多细节部分。

  • 更多细节

    1. cmake_minimum_required命令要求放在顶层的CMakeLists.txt文件的最开始,在其他命令执行前调用,这是因为后续的命令的行为表现可能跟版本有关系。
    2. 如果在函数内调用cmake_minimum_required,那么这个命令只在函数内起作用。
    3. cmake_minimum_required命令的实质是指定了当前工程支持的cmake版本范围,它暗含对cmake_policy的调用,而cmake_policy指定了cmake版本的策略机制,主要是为了保障在不同的cmake版本间的兼容性。
      • cmake的策略机制是为了保证,即使新cmake版本引入变化(新功能或者功能点变更),当前工程的构建仍然可以被兼容。
      • 每一种新的策略机制(cmake版本更新带来的变化)用形如CMP<NNNN>来标识,其中NNNN是一个整数,每一种的策略机制有NEWOLD两种行为表现,调用方式为cmake_policy(SET CMP<NNNN> OLD)cmake_policy(SET CMP<NNNN> NEW)。例如策略CMP0000为“必须指定cmake要求的最低版本”,该策略在2.6版本引入,并且不建议使用OLD行为,后续版本会考虑对该策略移除OLD行为;策略CMP0002为“逻辑目标名称必须全局唯一(逻辑目标名称即被add_executable()、add_library()、add_custom_target()创建的名称)”,该策略在2.6版本引入,并且不建议使用OLD行为,后续版本会考虑对该策略移除OLD行为。
      • 对于当前运行cmake版本已知的所有策略,若是在min(或max:运行的cmake高于max时)以及min之前版本引入的,都会被设置为NEW行为,在min之后版本引入的策略,行为不会被设置,需要显式指定(调用cmake_policy或者CMAKE_POLICY_DEFAULT_CMP<NNNN>)。假设运行的cmake版本为3.18.2min3.12.2max3.13.2,可以看到max小于当前运行的cmake版本(3.13.2<3.18.2),因此3.13.2之前的策略的模型行为是NEWCMP0081 = NEW),而3.13.2之后的策略默认为空(CMP0108 =):
       # CMakeLists.txt文件
       cmake_minimum_required (VERSION 3.12.2...3.16.2)
      
       cmake_policy (GET CMP0108 cmp_0108)# CMP0108为cmake 3.18引入的
       message (">>> cmp0108 = ${cmp_0108}")
      
       cmake_policy (GET CMP0081 cmp_0081) # CMP0081为cmake 3.13引入的
       message (">>> cmp0081 = ${cmp_0081}")
      
      # 执行结果
      >cmake .
      >>> cmp0108 =
      >>> cmp0081 = NEW
      


Cmake命令之cmake_minimum_required介绍 - 简书
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++-Cmake指令:cmake_minimum_required 的相关文章

随机推荐

  • 机器学习(1):独立同分布IID(independent and identically distributed)

    1 独立同分布independent and identically distributed i i d 在概率统计理论中 如果变量序列或者其他随机变量有相同的概率分布 并且互相独立 那么这些随机变量是独立同分布 在西瓜书中解释是 输入空间
  • 程序员的浪漫——欲寄彩笺兼尺素,山长水阔知何处

    欲寄彩笺兼尺素 山长水阔知何处 每当提及程序员 人们往往想到的是带着眼镜 不修边幅 面对电脑 两眼无光的窘态 然事实上每个热爱编程的人 内心深处都藏有一处不为人知充满着浪漫色彩与幻想气息的地方 而这个地方也只为一个人开放 每个热爱编程的程序
  • 在win10环境下的vscode中使用xdebug进行PHP断点调试

    第一步 下载VScode和phpstudy 具体下载网址我放到下面 VScode Visual Studio Code Code Editing RedefinedVisual Studio Code Code Editing Redefi
  • 深入浅出讲解:php的socket通信

    对TCP IP UDP Socket编程这些词你不会很陌生吧 随着网络技术的发展 这些词充斥着我们的耳朵 那么我想问 1 什么是TCP IP UDP 2 Socket在哪里呢 3 Socket是什么呢 4 你会使用它们吗 什么是TCP IP
  • mysql8坑太多_使用mysql8时遇到的一些坑

    1 时区问题 往数据库插入datetime类型的时间发现 数据库里存储的比实际晚13个小时 而服务器的时间是东八区没问题 解决方法 连接数据库url中加上serverTimezone GMT 2b8 2 java sql SQLExcept
  • Memcached 未授权访问漏洞验证

    Memcached 是一个高性能的分布式内存对象缓存系统 用于动态Web应用以减轻数据库负载 该服务的端号为 11211 使用绿盟漏洞扫描系统发现某服务器存在Memcached 未授权访问漏洞 如下图所示 验证方法一 使用nmap 脚本sc
  • 使用Gson解析复杂的json数据

    http blog csdn net tkwxty article details 34474501
  • [python学习] 简单爬取图片网站图库中图片

    最近老师让学习Python与维基百科相关的知识 无聊之中用Python简单做了个爬取 游讯网图库 中的图片 因为每次点击下一张感觉非常浪费时间又繁琐 主要分享的是如何爬取HTML的知识和Python如何下载图片 希望对大家有所帮助 同时发现
  • Unity 世界坐标转UI坐标

    一 Unity中有四种坐标系 1 World Space 世界坐标 三维空间坐标 浮点数 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0 0 点 右上角为 Screen width Screen height
  • cramfs文件系统制作

    参考 http blog csdn net liukun321 article details 7256456 1 首先配置内核 打开对cramfs的支持 File systems gt Miscellaneous filesystems
  • win10 安装svn遇到2503错误的解决办法

    win10安装 svn visualsvn ankhsvn 遇到2503错误 解决办法 以管理员身份打开cmd 输入命令 C windows system32 gt msiexec package D 软件 8 SVN AnkhSvn 2
  • vue 自定义组件切换时刷新

    我们在使用vue自定义组件时 常常会遇到切换组件的操作 但是切换组件的时候 如果没有处理好 组件内容就不会刷新 如 标签页下放自定义组件 切换标签时 组件里面的内容不刷新 导致页面停留在上一次的操作 那么我们应该如何来解决这个问题呢 接下来
  • 1 Linux系统性能测试与监测工具汇总

    综合能力 性能测试 Unixbench root localhost Run 计算 查看当前CPU负载 uptime root localhost uptime 测试单cpu计算能力 bc root localhost time echo
  • iOS APP开发

    iOS APP开发 一 个人开发者申请 苹果ID Apple ID 的创建 成为开发者 二 如何开发一个app Id 证书 配置文件 开发者账号的管理 iOS 项目打包和发布 一 个人开发者申请 使用苹果设备时必须要有一个苹果账户 苹果账户
  • unity场景体跳转教程(超简单)

    场景跳转 首先创建一个页面 如下图 在图片中添加画布 图片 按钮 再加一个空物体 这个场景我起名叫1 然后在新建一个一样的场景我叫的是2 里边同样有画布 按钮 空物体 然后再新建一个脚本文件夹写上如下代码 using System Coll
  • su: failed to execute /bin/bash: Permission denied问题解决

    昨天夜里发版 有两台机器因为云官方改配 突然切换不到普通用户 su su failed to execute bin bash Permission denied 根据百度 原来是 bin bash权限设置的原因 chmod 755 bin
  • vue+Ts 报vue ts this报Property ‘x‘ does not exist on type

    个人感觉就是TS检测不到this的类型 解决方法如下 1 第一种方法 this as any 后面跟要调用的就行 2 第二种方法 tsconfig json文件 strict false 改成false 参考链接 https cn vuej
  • 浅谈Python解释器的组成

    Python解释器是一个复杂的软件 它可以解释和执行Python代码 以下是Python解释器的主要组成部分 源代码词法分析器 Lexical Analyzer 这部分的任务是将输入的Python源代码分解成称为 tokens 的基础元素
  • Diffusion笔记

    一 Diffusion是什么 Diffusion 是一种去噪扩散模型 工作原理是对图像逐步施加噪点 直至图像被破坏变成完全的噪点 然后再逆向学习从全噪点还原为原始图像的过程 而 AI 所看到的是全是噪点的画面如何一点点变清晰直到变成一幅画
  • C++-Cmake指令:cmake_minimum_required

    命令格式 cmake minimum required VERSION