CMAKE cmake_policy命令

解决ROS Noetic没有serial包的问题 1、安装Serial包 ros-noetic没有serial包,所以需要自行下载安装。步骤如下 首先进入Downloads目录 cd ~/Downloads 然后下载serial源码 git clone https://github.com/wjwwood/serial.git 进入serial目录,安装编译 cd serial ccmake . 按c键,将CMAKE_INSTALL_PREFIX 变量值改为/opt/ros/noetic,再按c键 如果提示一长串以下开头 CMake Warning 阅读详情

引入原因

当我们使用 CMake工具编译项目的 CMakeLists.txt 存在两个问题。

  • 第一个问题是 CMake 工具版本太旧,
  • 第二个问题是 CMake 工具版本太新。

CMake 工具版本太旧的话,可能 CMakeLists.txt 使用了新的语法,就会不兼容;

CMake 工具版本太新的话,也会出现不兼容问题,因为 CMake 新版本在更新时 不一定向后兼容,CMake 老版本的一些功能可能删除、更改。

为了解决这些差异,保证我们的cmake代码始终可用,cmake 从版本2.0开始提出了policy这个概念。

使用

隐式的设置策略

使用语法:

  • 每个新发布版本一般都会引入一些新的策略,每个策略都会有一个标识号,格式CMP< NNNN >的标识符,<NNNN>对应四个0到9的整数。每个策略都在文档中描述了OLD和NEW的行为,以及引入的原因。
  • 可以通过如下命令来设置使用哪个版本的策略
    • < min>:最小版本,至少为2.4,至多为当前安装的版本号
    • < max>:最大版本,至少为< min>

1 cmake_policy(VERSION <min>[...<max>])  //通过版本来设置策略

使用场景:

  • 如果我们使用了 CMake 新的语法,那么需要通过 cmake_minimum_required() 命令限制 CMake 最低版本需求。
  • 如果 CMake 运行的版本 不在<min>...<max>版本 之间,会报错。

关于cmake_minimum_required和cmake_policy:

  • 调用cmake_minimum_required会隐式调用cmake_policy(VERSION),指定版本引入的所有策略都将设置为 NEW 行为。

  • 如果没有特别的策略要指定,可以直接通过调用cmake_minimum_required即可,无需调用cmake_policy。

使用示例:

  • CMake 版本 最低为 3.0。
cmake_minimum_required(VERSION 3.0)
# 相当于调用了 
cmake_policy(VERSION 3.0)
  • CMake 版本 最低为 3.0,最高位3.7。
cmake_minimum_required(VERSION 3.0...3.7)
# 相当于调用了 
cmake_policy(VERSION 3.0...3.7)
  • 如果需要运行 的 CMake 版本 高于 3.0,但是引入的策略为 CMake 版本 在 3.0 和 3.5 之间。
cmake_minimum_required(VERSION 3.0)
cmake_policy(VERSION 3.0...3.5)

显式的设置策略

也可以直接使用cmake_policy显示设置策略的行为,为OLD或为NEW。如下:

// 使用 NEW 来声明后续代码依赖于此policy。
cmake_policy(SET CMP<NNNN> NEW)
// 使用OLD来向使用此policy的配置过程发出警告信息。
cmake_policy(SET CMP<NNNN> OLD)

告诉CMake对给定的策略使用旧的或新的行为。

  • 依赖于给定策略的旧行为的项目可以通过将策略状态设置为“旧”来消除策略警告。
  • 或者,可以修复项目以使用新行为,并将策略状态设置为new。

注意:策略的OLD行为一般不可取,因为在未来的版本中可能被抛弃。

获取当前设置了什么策略

// 使用GET来获取当前支持的policy。
cmake_policy(GET CMP<NNNN> <variable>)

检查策略是否设置为 OLD 或 NEW 行为,值存放到< variable >中。如果没有设置,那么< variable >为空

if (POLICY CMP< CMAKE_POLICY>)

使用此条件来判断当前的cmake是否支持某条policy。

临时设置policy

  • CMake 将策略设置保存在一个栈结构中,当进入一个项目的子目录时,就会在策略栈中入栈新的一层元素,离开子目录时就会出栈这层元素。因此在一个项目的子目录中设置策略并不会影响父目录以及同层路径,但会影响子目录。
  • 这在一个项目包含了多个分别维护的子目录但在一起编译时非常有用,它可以让不同的子目录使用不同的策略版本。
  • 用户可以使用 cmake_policy 命令来入栈出栈自己的临时策略层,只要入栈和出栈是成对出现的,这对于临时对一小段代码改变策略设置时比较有用。
cmake_policy (PUSH)
#change cmake policy
#do something
cmake_policy (POP)
// PUSH和POP必须是成对的。

说明:

  • 对cmake_minimum_required(VERSION)、cmake_policy(VERSION)或cmake_policy(SET)命令的调用只影响策略堆栈的当前顶部,影响全局
  • cmake_policy(PUSH)、cmake_policy(POP)是临时的,只影响当前子目录

实验

实验一

向一个CMakeLists.txt中添加以下内容(new表示后继代码必须支持此策略):

cmake_policy(SET CMP9999 NEW) # CMP9999 is not defined yet

会发现报错:

> [CMake] CMake Error at CMakeLists.txt:14 (cmake_policy):
1> [CMake]   Policy "CMP9999" is not known to this version of CMake.

实验二:策略中 NEW 与 OLD 的区别

例如,我们在 CMake 3.0 版本中,引入策略 CMP0048。表示在 CMake 3.0 版本中,引入 project() 命令使用 VERSION 设定版本。

默认情况下,cmake-3.19.2 会启用策略 CMP0048。如果不想使用该策略,通过 cmake_policy 命令设置为 OLD。一般设置该策略为 OLD,如果在 project() 命令使用 VERSION 会报错。

if(POLICY CMP0048)
  cmake_policy(SET CMP0048 OLD)
endif()

报错如下:
在这里插入图片描述

可以通过 cmake_policy 命令设置为 NEW,使用该策略,这样就不会报错了

if(POLICY CMP0048)
  cmake_policy(SET CMP0048 NEW)
endif()
  • OLD相当于强制设置某个策略过期
  • NEW相当于强制指定使用某个策略

注意,如果你想要查询CMP0048 之类的是什么行为,去官网找吧

实验三:

当前场景:

  • 假设当前系统上cmake的运行版本为3.0,但是我们cmake_minimum_required(VERSION 2.6) 指定策略版本为 2.6,但是我们要使用cmake 3.0版本引入的CMP0048 怎么办?

也就是说:

  • 我们虽然指定了 CMake 最低运行版本,但是源文件使用了高于 CMake 版本的语法,但是我们不想为了使用了新的语法,而更改 cmake_minimum_required() 命令,那么怎么做?

解决方法:

cmake_minimum_required(VERSION 2.6)
if(POLICY CMP0048)
  cmake_policy(SET CMP0048NEW)
endif()

说明:

  • 对于一些不重要的策略,可以使用一种兼容的手段。
    • 如果运行的 CMake 版本 足够,支持该策略,那么设置为 NEW 行为,因为使用 cmake_minimum_required() 命令通过隐式设置的最新策略为 OLD 行为;
    • 如果运行的 CMake 版本不足够,不支持该策略,那么什么都不做。

实验三

cmake_policy(PUSH)
cmake_policy(SET CMP0057 NEW)
...
if (SOME_ITEM IN_LIST SOME_LIST) # IN_LIST needs CMP0057
...
cmake_policy(POP)

当使用不支持此policy的cmake版本configure时,cmake会报错并终止configure流程:

1> [CMake] CMake Error at CMakeProject1/CMakeLists.txt:15 (cmake_policy):
1> [CMake]   Policy "CMP0057" is not known to this version of CMake.

我们可以使用此方式来声明该段代码必须使用支持此policy的cmake版本。注意作用域仅限于此段代码。

实验四

cmake_policy(PUSH)
cmake_policy(VERSION 3.15)
list(PREPEND SOME_LIST ${SOME_ITEM}) # PREPEND needs cmake 3.15
cmake_policy(POP)

当使用低于此version的cmake版本configure时,cmake会报错并终止configure流程:

1> [CMake] CMake Error at CMakeProject1/CMakeLists.txt:15 (cmake_policy):
1> [CMake]   An attempt was made to set the policy version of CMake to "3.15" which is
1> [CMake]   greater than this version of CMake.  This is not allowed because the
1> [CMake]   greater version may have new policies not known to this CMake.  You may
1> [CMake]   need a newer CMake version to build this project.

当某个cmake feature没有设置特定的policy时,我们可以使用此方式来声明该段代码必须使用不低于这个版本的cmake。注意作用域仅限于此段代码。

CMake版本约束的陷阱大全:从cmake_minimum_required的7个常见误用说起 本文深入解析CMake构建工具中`cmake_minimum_required`命令的7个常见误用陷阱,包括作用域差异、版本号解析规则、与project()的调用顺序等关键问题。通过实际代码示例和最佳实践建议,帮助开发者避免版本约束导致的兼容性和策略设置问题,提升C/C++项目的构建可靠性。 阅读详情

相关推荐

CMake CMake Policy Commands

CMake是一个跨平台的构建工具,它使用CMakeLists.txt文件来描述项目的构建过程和依赖关系。在CMake中,CMake策略(CMake Policy)是一种机制,用于控制和管理CMake的行为和特性。CMake策略可以影响构建过程中的警告、错误处理和默认行为等方面。在本文中,我们将详细介绍CMake中的CMake策略命令,并提供相应的源代码示例。通过使用上述CMake策略命令,可以有效地控制和管理CMake的行为和特性。这对于确保项目在不同的CMake版本和环境下的一致性非常重要。

KgCrystal的博客 201

cmake:cmake_policy命令

引入原因 管理CMake策略设置。有关定义的策略,请参阅cmake policies(7)手册。 随着CMake的发展,为了修复bug或改进现有特性的实现,有时需要更改现有行为。 CMake策略机制旨在帮助在CMake的新版本引入行为更改时保持现有项目的构建。 每个新策略(行为变化)都会被赋予一个形式为CMP< NNNN >的标识符,其中< NNNN >是一个整数索引。 与每个策略相关的文档描述了旧的和新的行为以及引入策略的原因。 项目可以设置每个策略来选择所需的行为。 当CMak

OceanStar的博客 1万+

Linux: dev: cmake --help-policy CMP0115

今天遇到一个新的policy,有点奇怪,感觉老的行为更方便一点。算是cmake新版导致的一个行为改变。继续使用原来的行为。

mzhan017的博客 648

[cmake]cmake命令之cmake_policy

通过CMP形式来唯一定义一个策略,例如CMake的3.23版本,定义的策略有130个,从CMP0000到CMP0129。

FL1768317420的博客 1953

xctf攻防世界 MISC高手进阶区 low

1. 进入环境,下载附件 给出的一张bmp图片,没有其他信息 2. 问题分析 扔进binwalk中,没有发现有用信息 使用zsteg,没有有用信息 塞入StegSolve中,发现有点猫腻,如图: 有点二维码的感觉,emmm,需要像素处理,但不知道如何下手,参考网上的wp,发现是让使用lsb隐写,copy代码: from PIL import Image img = Image.open('./pic/low.bmp') img_tmp = img.copy() pix = img_tmp.load()

l8947943的博客 1万+

中山大学_数据科学与计算机_预推免

前言 2019 年 9 月中旬是中山大学预推免时间,本人没能进到夏令营,但是最后在预推免上岸也算不幸中的万幸。 记忆不一定准确,但希望能帮到他人。 想看 流程 的可以直接看总结,正文部分有本人心路历程。 预推免 中山大学的预推免大致可以分为 报道,机试,面试 三大部分,而且尤其是面试,所有人加起来总时长 3 天,幸运的是,本人被安排在第一天的下午第一场,上午就是机试,报道,机试,面试,无缝衔接。 ...

一把健 5208

cmake_policy指令详解

通过使用 cmake_policy,开发者可以确保项目在不同版本的 CMake 中构建时,行为是一致的,从而避免因 CMake 版本升级而引入的潜在问题。CMake 政策用于控制 CMake 在不同版本之间的行为更改,确保项目在使用不同版本的 CMake 时行为一致。这会设置 CMake 的策略版本。通过设置策略版本,CMake 会自动为该版本之前引入的所有策略设置适当的行为。这些命令用于保存和恢复当前的策略设置,允许在 CMake 脚本的某一部分临时更改策略而不会影响到其他部分。

qq_37805392的博客 836

绕过ROS2!在RDK X5上直接用Python调用海康相机C++ SDK的避坑指南

本文详细介绍了在RDK X5上绕过ROS2,直接使用Python调用海康相机C++ SDK的轻量化方案。通过Cython构建Python绑定,提取海康相机SDK核心组件,实现高效图像采集。文章涵盖环境准备、Cython接口设计、编译系统配置及性能优化技巧,特别适合ARM64平台开发者。

weixin_33712987的博客 250

CMake中cmake_policy的使用

CMake中cmake_policy的使用

网络资源是无限的 3315

90+个各种疾病相关医疗数据集

含新冠、传染病、医学图像等

2万+

js逆向第3例:蝉妈妈大屏实时数据formDataSign加密

蝉妈妈大屏抖音直播实时数据是抓取抖音直播间数据的实时数据,有类似需求的公司但没有能力去搞定抖音,抓取蝉妈妈数据也是一个不错的选择。接下来就是调试找到加密点,说句题外话蝉妈妈的所有js文件打包方式用的都是webpack5,那如何区分打包方式可以阅读这篇文章。时间戳 ,经过观察发现加密参数是实时变化的。这个函数扣下来,在浏览器控制台中测试一下。言归正传,打断点找到变量。继续打断点向上找又发现了。查看请求参数,可以看到。请求的内容,那么这个。

花臂不花Home 1540

cmake_策略命令cmake_policy() 和各种内置变量

本文记录cmake。

weixin_43916755的博客 1182

R语言机器学习算法实战系列(十五)随机森林生存预后模型+SHAP值 (Random Survival Forest + SHAP)

本教程运用随机森林生存分析筛选与患者生存状态显著相关特征。该方法借随机森林这一强大机器学习算法,构建多棵决策树并集成结果,以提高生存分析准确性,识别关键生物标志物。接着,利用选定特征构建风险得分,将多个特征转化为单一数值,量化患者风险水平。之后,依据风险得分将患者分为高、低风险亚型,为临床治疗提供个性化指导。最后,通过分析时间依赖的 ROC 曲线评估模型长期预测能力。此曲线计算不同阈值下的真正例率与假正例率,在多个时间点评估,全面展现模型长期稳定性与准确性。。并且增加了SHAP值评估特征重要性

专注生信领域 2623

CMake中cmake_minimum_required的使用

CMake中cmake_minimum_required的使用

网络资源是无限的 1万+

DeepSeek与YOLO融合技术的微信小程序实现方案

本文介绍了一个基于微信小程序和Flask后端的智能图像检测系统。系统采用DeepSeek-7B进行自然语言理解,YOLOv8执行目标检测,并通过融合验证模块确保结果准确性。核心流程包括:用户通过小程序上传图片和文本需求,后端解析意图后执行目标检测,最后验证并返回结果。关键技术包括DeepSeek的指令理解、动态阈值调整和模型优化(ONNX、TensorRT)。系统适用于工业质检等场景,如"检测表面划痕",能自动识别目标并验证结果。部署需GPU服务器,并包含安全机制保障系统稳定运行。

老郑的博客 273

基于ESP32和OV5640的目标检测系统

本文详细介绍了基于ESP32-S3和OV5640摄像头构建目标检测系统的完整方案。系统采用YOLOv8-Nano轻量级模型,通过INT8量化实现边缘部署,在UXGA分辨率下达到25fps帧率。文章从硬件选型、图像采集优化、模型量化部署、实时推理流水线构建等维度展开,重点解决了内存管理、电源稳定性和异常处理等嵌入式系统关键问题。该方案在资源受限条件下实现了150ms以内的端到端延迟,为物联网视觉应用提供了低成本、低功耗的解决方案,适用于智能家居、工业检测等多个场景。

reset2021的博客 329

CMake 手册详解(七)

CMD#11:build_command  获取构建该工程的命令行。 build_command( [CONFIGURATION ] [PROJECT_NAME ] [TARGET ])   把给定的变量设置成一个字符串,其中包含使用由变量CMAKE_GENERATOR确定的项目构建工具,去构建

843

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

CMake中include的使用

CMake中include的使用

网络资源是无限的 5335

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

cmake:cmake_minimum_required命令

cmake_minimum_required 要求cmake的最小版本。 cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR]) 3.12版新增:可选的< policy_max >版本。 设置项目所需的cmake的最低版本。还将按照下面的说明更新策略设置 < min>和可选的< policy_max>都是major.minor[.patch[.]形式的CMake版本

OceanStar的博客 4545

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

CMake(十一):策略

cmake系统学习

jjjstephen的博客 1301

【CMake】策略

命令的唯一目的,就是管理我们之前讨论的策略(Policies),即那些CMPXXXX开关。它允许你查询、设置、保存和恢复这些策略的状态。有多个子命令,每个都有其特定的用途。我们将逐一分解。1.作用:显式地将单个策略设置为NEW或OLD行为。何时使用当 CMake 产生策略警告,提示你时,你用它来明确指定行为,从而消除警告。当你了解一个策略的新旧行为差异,并主动决定你的项目要采用哪一种时。示例# 启用 CMP0077 的新行为(option() 命令尊重普通变量)

2301_80224556的博客 1129

CMake政策警告终极抑制指南:轻松解决CMPNNNN配置问题

CMake作为现代C++项目构建的首选工具,其政策系统确保了项目在不同版本间的兼容性。然而,当CMake政策警告如CMP0066、CMP0082、CMP0128等不断出现时,开发者往往感到困扰。本文将为您详细介绍CMAKE_POLICY_WARNING_CMPNNNN配置的各种技巧,帮助您快速有效地抑制这些警告信息。😊 ## 什么是CMake政策警告? CMake政策是CMake版本兼容性管

gitblog_01074的博客 580

Cmake学习

CMake学习

pika_pika_wang的博客 148

CMake 策略(Mastering CMake 笔记)

CMake 在添加新特性后可能不会完全兼容旧的 CMake 版本,这导致了在新版本的 CMake 中使用旧的 CMakeLists 文件时可能会存在一些问题。策略的引入就是帮助用户和开发者解决这些问题,它是 CMake 中用来改善向后兼容性和追踪兼容性的一种机制。

一只菜鸟的专栏 5517

【学习笔记】Mastering CMake (六)—— 策略

学习笔记,随时更新。如有谬误,欢迎指正。说明:红色字体。

cxsydzn的博客 1208
上一篇: MIPI
下一篇: i.MX6ULL(八) GPT高精度定时器
江太翁
博客等级 码龄15年 271粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值