CMake入门(1)

news2024/11/25 13:46:09

背景

目前很多大型框架都是使用cmake去构建,如果看不懂cmake, 在实际修改框架,添加新的模块时候就会受制于人,为此需要了解cmake的相关基础支持,避免被某些装逼大佬卡脖子,同时也进一步提高自己的业务水平。

变量

cmake里面的变量主要有两种方式:option 和 set 两种方式,简单如下:

set(var "hello") //set(变量名 值)
option(use_option "opiton" ON) //option(变量名 “信息说明” 值)

option

其实option可以等效于:

set(use_option ON CACHE BOOL "option") //set(变量 值 CACHE 类型 “信息说明”)

为什么说可以等效于set,因为可以通过生成的CMakeCache.txt查找到这个值。当在写CMakeLists.txt的时候没有给一个ON的值的时候(为空,为OFF, 或者其他乱七八糟的字符串的时候),我们查看CMakeCache.txt的时候会发现use_option都是被设置为OFF。
在这里插入图片描述

set

  • 变量类似于C++语言,有先后的顺序,只有先声明或者定义,后面的代码才可见。
  • 变量作用域概念,为了方便简单参考下面的文件布局,当在主目录的CMakeLists.txt中定义一个变量时,在first中CMakeLists.txt会把主目录的的变量拷贝到子目录,类似C++中的函数传值概念,所以在子目录中怎么修改都不会改变其他子目录的值,以及主目录的值。
    在这里插入图片描述
  • cache 概念,cache可以理解为全局变量,官网解释说当作一个config, 会存在CMakeCache.txt中,在定义的时候会给一个默认值。下面是一个demo, 首先在first文件中如下设置:
  set(first "first")
  set(cache "first set cache" CACHE STRING "test cache")
  message(STATUS "${first}")

在second中

  set(second "second")
  message(STATUS "${second}")
  message(STATUS "second show cache = ${cache}")
  set(cache "second change cache" CACHE STRING "SECOND TEST CACHE")
  message(STATUS "after chage in second = ${cache}")

在主目录中

  1 cmake_minimum_required(VERSION 3.12)
  2 project(hello)
  3 
  4 set(hello "hello")
  5 message(STATUS "${hello}")
  6 if(DEFINED cache)
  7     message(STATUS "${cache}")
  8 else()
  9     message(STATUS "no cache")
 10 endif()
 11 
 12 add_subdirectory(first)
 13 add_subdirectory(second)
 14 
 15 message(STATUS "main subdirectory =  ${cache}")

结果:cmake …
在这里插入图片描述
好好体会上面的代码。

关于set问题

  • 为什么在second中set(cache “second change cache” CACHE STRING “SECOND TEST CACHE”)没有生效??
  • 如果改成set(cache “second change cache”)会有什么效果?
  • cmake … -Dcache=“change cache” 执行呢?

回答

问题一:当CMakeCache.txt中已经有了变量名字,再次定义的会会被直接忽略。
问题二:当修改后,在second文件中会出现一个局部变量cache, cmake的逻辑是优先读取局部cache的值。效果如下:
在这里插入图片描述
问题三:可以理解在main目录下起始位置定义一个局部变量cache,后面子目录也会拷贝到自己的作用域,所以结果可想而知:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hello算法学习笔记之数组与链表

一、数组 线性数据结构,其将相同类型元素(链表就不一定要存储相同类型的元素)存储在连续的内存空间中。。数组有Index 数组的优点:访问很高效,O(1) PS:元素长度是单个元素占用的内存空间&…

CSS基础学习--13 Display(显示) 与 Visibility(可见性)

一、定义 display属性设置一个元素应如何显示 visibility属性指定一个元素应可见还是隐藏 二、隐藏元素 - display:none或visibility:hidden 隐藏一个元素可以通过把display属性设置为"none",或把visibility属性设置为"hidden"。但是请注意&am…

Aprioi关联算法

国际权威的学术会议IEEE International Conference on Data Mining (ICDM) 评选出了数据挖掘领域的十大经典算法,他们分别是:C4.5、kMeans、SVM、Apriori、EM、PageRank、AdaBoost、KNN、Naive Bayes以及CART。今天就让我们共同探讨一下十大算法之一Apri…

红黑树的插入和删除

红黑树(C) 红黑树简述红黑树的概念红黑树的性质红黑树结点定义 一,红黑树的插入插入调整插入代码 二,红黑树的验证三,红黑树的删除待删除的结点只有一个子树删除结点颜色为红色删除结点颜色为黑色 删除的结点为叶子节点…

【OpenMMLab AI实战营二期笔记】第六天 MMDetection代码课

0. 环境检测和安装 # 安装 mmengine 和 mmcv 依赖 # 为了防止后续版本变更导致的代码无法运行,暂时锁死版本 pip install -U "openmim0.3.7" mim install "mmengine0.7.1" mim install "mmcv2.0.0"# Install mmdetection rm -rf mmd…

软考A计划-系统架构师-知识点汇总-上篇

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

Python转行的一点心得

Python现在非常火,语法简单而且功能强大,很多同学都想学Python!最近陆陆续续有很多小伙伴问我,学Python到底应该做什么,从事哪种岗位。下面是我们工作圈里面一些同学的苦恼: 一转行要趁早 上面类似的问题群里还有很多…

华为HCIA备考 易错题整理

1.IEEE802.1Q定义的 VLAN 帧格式中VLAN ID总共有多少bit 答:12 2.NAPT允许多个私有IP地址通过不同的端口号映射到同一个公有IP地址上,且不需要做任何关于端口号的配置。 3.IEEE802.1Q定义的VLAN帧总长度为多少字节? 答:4 4.关于…

阿里云创建ALB_Ingress

阿里云参考文档 1、编写alb AlbConfig创建文档 rootbiking-pre-middleware:~/alb# cat ingress-alb.yaml apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: #alb名称name: ingress-alb spec:config:name: ingress-albaddressType: InternetzoneMappings:# 两个交换…

chatgpt赋能python:Python按行输出方法

Python按行输出方法 Python作为一种快速易用的编程语言,广泛应用于数据分析、科学计算、web开发等领域。在Python编程过程中,输出数据是必不可少的环节。本文将介绍如何按行输出Python数据,为Python编程初学者提供参考。 什么是按行输出 按…

consul入门案例及配置热更新的实现

Consul的简单入门 当Producer启动时,会向Consul发送一个post请求,告诉Consul自己的ip和Port;Consul接收到producer的注册后,每个10S(默认),会向producer发送一个健康检查的请求,检验Producer是否健康当Consumer发送GET方式请求/api/address到Producer时,会先从Consul中拿到一个…

超越密码:网络安全认证的未来

你的物理现实的数字对应物正在惊人地增长。虽然肯定会有积极的结果,但随着互联网的发展,与之相关的风险也在迅速增加。在讨论网络安全风险管理时,首先想到的是密码。但当出现诈骗、网络钓鱼等威胁时,这还不够。 那么,…

chatgpt赋能python:Python爬虫:抓取数据的实用技巧

Python爬虫:抓取数据的实用技巧 如果您是一名数字营销从业者,那么您一定知道SEO的重要性。SEO是一项复杂的工作,但是其中包含了一个非常关键的步骤,就是通过爬虫从网站中抓取数据。Python是一个非常强大的工具,可以帮…

网络层:静态路由配置及其可能产生的路由环路问题

网络层:静态路由配置及其可能产生的路由环路问题 笔记来源: 湖科大教书匠:静态路由配置及其可能产生的路由环路问题 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 静态路由配置是指用户或网络管理员使用路由器的…

chatgpt赋能python:Python实现直线拟合及求斜率

Python实现直线拟合及求斜率 什么是直线拟合 直线拟合是一种数据处理方法,将一组数据点拟合成一条直线的形式,以求出其中的规律性关系,从而更好地理解数据点之间的相关性。 直线拟合的应用场景 直线拟合在很多领域都有应用,例…

openGauss5 企业版之开发设计规范

文章目录 1.数据库对象命名2. Database和Schema设计2.1 Database设计建议2.2 Schema设计建议 3. 表设计3.1选择存储方案3.2 选择分布方案3.3 选择分区方案3.4 选择分布键 1.数据库对象命名 数据库对象命名需要满足约束: 标识符非时序表长度不超过63个字节&#xff…

SSTI---总结

Laravel Blade是Laravel提供的一个既简单又强大的模板引擎 和其他流行的PHP模板引擎不一样,Blade并不限制你在视图view中使用原生的PHP代码 所有的Blade视图页面都将被编译成原生的PHP代码并缓存起来,除非你的的模板文件修改,否则不会重新编…

【RabbitMQ教程】第一章 —— RabbitMQ - 安装

💧 【 R a b b i t M Q 教程】第一章—— R a b b i t M Q − 安装 \color{#FF1493}{【RabbitMQ教程】第一章 —— RabbitMQ - 安装} 【RabbitMQ教程】第一章——RabbitMQ−安装💧 🌷 仰望天空,妳我亦是行人.✨ &#x…

腾讯丁珂:以数字安全免疫力建设安全新范式

6月13日,腾讯安全联合IDC等多家机构在北京举办研讨论坛,并发布“数字安全免疫力”模型框架,提出用免疫的思维应对新时期下安全建设与企业发展难以协同的挑战。腾讯集团副总裁、腾讯安全总裁丁珂在论坛上表示,数智化新阶段&#xf…

springCloud 中,openFeign 使用说明

文章目录 1、openFeign 中的每个方法中的参数和注解不能少。2、开启日志打印功能3、超时 1、openFeign 中的每个方法中的参数和注解不能少。 如果服务端方法中的数据含有注解,则 客户端 openFeign 中的每个方法中的参数和注解一个不能少,比较完全一致。…