CMake详解-程序员宅基地

技术标签: android  cmake  

什么是CMake

  • 在android studio 2.2及以上,构建原生库的默认工具是 CMake。

  • CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。Cmake 并不直接建构出最终的软件,而是产生其他工具的脚本(如Makefile ),然后再依这个工具的构建方式使用。

  • CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。从而达到跨平台的目的。Android Studio利用CMake生成的是ninja,ninja是一个小型的关注速度的构建系统。我们不需要关心ninja的脚本,知道怎么配置cmake就可以了。从而可以看出cmake其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。

CMake源文件

  • CMake的源码文件可以包含命令、注释、空格、和换行。
  • 以CMake编写的源文件以CMakeLists.txt命名或以.cmake为扩展名。
  • 可以通过add_subdirectory()命令把子目录的CMake源文件添加进来。
  • CMake源文件中所有的语句都是命令,可以是内置命令或自定义的函数/宏命令

CMake变量

  • CMake中所有变量都是string类型。可以使用set()和unset()命令来声明或者移除一个变量
  • 变量的引用:${变量名}
#声明变量:SET(变量名  变量值)
SET(var 666)
#引用变量 message命令用来打印
MESSAGE("var=${var}")

CMake变量的作用域

  • 全局层:cache变量,在整个项目范围内,一般在SET定义变量时,指定CACHE参数就能定义为cache变量。
  • 目录层:在当前目录CMakeLists.txt中定义,以及在该文件包含的其它cmake源文件中定义的变量。
  • 函数层:在命令函数中定义的变量,属于函数作用域内的变量。

CMake列表(lists)

  • 列表也是字符串,可以把列表看做一个特殊的变量,这个变量有多个值。
  • 语法格式:SET(列表名 值1 值2… 值N)或者SET(列表名 “值1;值2;…值N”)
  • 列表的引用 ${列表名}
#SET(列表名 值1 值2... 值N)
#或者SET(列表名 “值1;值2;...值N”)
SET(list_var 1 3 5 7)
#或
SET(list_var "1;3;5;7")
MESSAGE("list_var=${list_var}")

CMake流程控制-布尔常量

类型
true 1,ON,YES,TRUE,Y,非0的值
false 0,OFF,NO,FALSE,N,IGNORE,NOTFOUND,
空字符串,以-NOTFOUND结尾的字符串

CMake流程控制-操作符

类型
一元 EXIST,COMMAND,DEFINED
二元 EQUAL,LESS,LESS_EQUAL,GREATER,GREATER_EQUAL,
STREQUAL,STRLESS,STRLESS_EQUAL,STRGREATER,
STRGREATER_EQUAL,VERSION_EQUAL,VERSION_LESS,
VERSION_LESS_EQUAL,VERSION_GREATER,VERSION_GREATER_EQUAL,MATCHES
逻辑 NOT,AND,OR

CMake流程控制-循环遍历

循环遍历一

  • 语法格式:
    foreach(循环变量 参数1 参数2 … 参数n)
    COMMAND(ARGS …)
    endforeach(循环变量)
  • 每次迭代设置循环变量为参数。
  • foreach也支持breack()和continue()命令跳出循环。
FOREACH(item 2 4 6)
    MESSAGE("item=${item}")
ENDFOREACH(item)    

循环遍历二

  • 语法格式:
    foreach(循环变量 RANGE total)
    COMMAND(ARGS …)
    endforeach(循环变量)
  • 循环范围从0到total。
FOREACH(item RANGE 6)
    MESSAGE("item=${item}")
ENDFOREACH(item)    

循环遍历三

  • 语法格式:
    foreach(循环变量 RANGE start stop step)
    COMMAND(ARGS …)
    endforeach(循环变量)
  • 循环范围从start到stop,循环增量为step。
FOREACH(item RANGE 1 6 2)
    MESSAGE("item=${item}")
ENDFOREACH(item)    

循环遍历四

  • foreach还支持对列表的循环。
  • 语法格式:
    foreach(循环变量 IN LISTS 列表)
    COMMAND(ARGS …)
    endforeach(循环变量)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011150681/article/details/103630938

智能推荐

opencv 图像上画出目标运动的轨迹_OpenCV视频分析-Meanshift、Camshift&运动轨迹绘制...-程序员宅基地

文章浏览阅读1.9k次。基于均值迁移的对象移动分析(Meanshift)️ ️概述本质:️ Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计,在某一连续点处的密度函数值可由该点邻域中的若干样本点估计得出。直观的理解:️ 一堆点集,一个圆形的窗口在不断的移动,移动的方向是沿着点的密度最大的区域移动,图示如..._通过图像计算目标运动

安全防御------防火墙_防火墙策略里local区域-程序员宅基地

文章浏览阅读563次。本章主要讲解了防火墙的相关知识,包括基本概念,技术类型,安全区域,状态检测等。还包含FTP协议的有关概念以及ASPF技术。_防火墙策略里local区域

openjudge1.3答案_openjudge题库答案1.3-程序员宅基地

该文章为程序代码,主要包括使用C++和C语言解决问题的代码片段。

短视频矩阵系统的发展趋势与未来展望-程序员宅基地

文章浏览阅读600次,点赞12次,收藏11次。随着移动互联网的普及和用户消费习惯的改变,越来越多的内容创作者和企业开始注重短视频矩阵系统的建设。短视频矩阵系统具有多平台、多账号、多内容的特点,能够实现多角度、多层次的内容覆盖,提高品牌曝光度和用户粘性。随着短视频市场的成熟,商业模式创新将成为短视频矩阵系统可持续发展的重要保障。未来,短视频平台将探索更多元化的盈利模式,如广告投放、付费观看、打赏等,实现创作者、平台和用户的共赢。本文将探讨短视频矩阵系统的发展趋势和未来展望,以期为相关行业的发展提供有益的参考。三、短视频矩阵系统的未来展望。

更便捷更高效地生产影像地图瓦片_瓦片数据库生产-程序员宅基地

文章浏览阅读1k次。针对海量影像地图,采用地理处理建模构建切片业务流程,并应用“基于金字塔算法生成瓦片”的方案实施更高效的影像地图瓦片生产。_瓦片数据库生产

00942 ora 表存在_"ORA-00942: 表或视图不存在" 的原因和解决方法-程序员宅基地

文章浏览阅读1.3w次。1、问题产生的原因Oracle 是大小写敏感的,我们创自己写Sql脚本创建表的时候Oracle会自动将我们的表名,字段名转成大写。2、问题分析但是 Oracle 同样支持"" 语法,将表名或字段名加上""后,Oracle不会将其转换成大写。如果加上了"",那么我们采用一般的SQL语句查询则会产生“ORA-00942: 表或视图不存在 ”,因此SQL脚本中需要将表名也加上""。例如:select*..._ora00942表或视图不存在,但明明存在

随便推点

微信小程序:wx.navigateTo从子页面跳回父页面,页面不刷新的问题_navigateto 跳转再跳回时触发那个生命周期函数-程序员宅基地

文章浏览阅读1.8w次,点赞9次,收藏17次。先简要说说小程序的生命周期: 应用的生命周期:App({…}) 用来注册小程序,指定小程序的生命周期 页面的生命周期:Page({…}) 注册页面,指定页面的生命周期 具体注册函数的内容见小程序官网API其中有三个生命周期函数的触发顺序:onLoad->onShow->onReady (页面加载->页面显示->页面初次渲染) onLoad和onReady每个页面..._navigateto 跳转再跳回时触发那个生命周期函数

properties出现中文乱码解决方法(万能)_properties中文乱码-程序员宅基地

文章浏览阅读2.5k次。比如在vscode或者txt输入中文格式,在idea使用UTF-8表示,格式可不是真正的UTF-8!默认使用vscode或者txt编辑方式进行编辑,之后在idea进行打开,都会出现格式错误。可到了这一步,中文还是乱码(这一步改成功的网友可自动立场,没改成功的网友继续!至于改动不成功,原因在于文件编写的时候默认格式错误,于是怎么转换都出现问题(,在idea转换为UTF-8,格式可能乱码!正常思维来讲,估计是中文编码有问题,于是我将其改为UTF-8的编码方式。使用txt文件或者vscode文件,打开文件编写。_properties中文乱码

一个主题是王嘉尔的静态网页(html+css 附源代码)-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏3次。【好像是没用到js 时间太久远所以忘记了】【没考虑多设备适配和弹性布局嗷 在大部分电脑上显示还是正常的】【依然很菜……纯粹写来玩的QAQ】【emo 最近好累吖】在我的电脑上(联想小新pro13呜呜呜大三的时候一定要换一台有独显的电脑)显示是这样的代码<html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-

十六进制转换八进制_十六进制转换成八进制代码-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏12次。代码如下#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;math.h&amp;gt;#include&amp;lt;string.h&amp;gt;int main(){ int n,i,j,k,len,t; int b[10],c[10]; scanf(&quot;%d&quot;,&amp;amp;n); char a[10][99]; for(i_十六进制转换成八进制代码

用深度神经网络写一段股市预测代码-程序员宅基地

文章浏览阅读79次。根据历史数据建立模型,使用深度神经网络(DNN)训练模型,以预测股市走势:import numpy as npimport tensorflow as tf# 准备数据X = np.array([[1, 2, 3], [4, 5, 6]])y = np.array([7, 8])# 创建模型model = tf.keras.models.Sequential()model.add(tf...._深度学习股票预测代码

Linux updatedb命令教程:如何更新locate命令的文件名数据库(附实例详解和注意事项)-程序员宅基地

文章浏览阅读2k次,点赞60次,收藏42次。updatedb(update database)命令用于更新locate命令使用的文件名数据库。如果数据库已经存在,它的数据会被重用,以避免重新读取未改变的目录。updatedb通常由cron每日运行,以更新默认数据库。

推荐文章

热门文章

相关标签