CMakeLists.txt 简单的语法介绍

一. 简介

前面通过几个简单地示例向大家演示了 cmake 的使用方法,由此可知,cmake 的使用方法其实还是非常简单的,重点在于编写 CMakeLists.txt,CMakeLists.txt 的语法规则也简单,并没有 Makefile 的语法规则那么复杂难以理解!
本小节我们来学习 CMakeLists.txt 的语法规则。

二. CMakeLists.txt 简单的语法介绍

1. 注释

在 CMakeLists.txt 文件中,使用"#"号进行单行注释,譬如:

复制代码
#
# 这是注释信息
#
cmake_minimum_required(VERSION 3.5)
project(HELLO)

大多数脚本语言都是使用"#"号进行注释。

2. 命令(command)

通常在 CMakeLists.txt 文件中,使用最多的是命令,譬如上例中的 cmake_minimum_required 、 project 都是命令;命令的使用方式有点类似于 C 语言中的函数,因为命令后面需要提供一对括号,并且通常需要我 们提供参数,多个参数使用 空格 分隔而不是逗号 " , ",这是与函数不同的地方。
命令的语法格式如下所示:

复制代码
command(参数 1 参数 2 参数 3 ...)

不同的命令所需的参数不同,需要注意的是,参数可以分为必要参数和可选参数(通常称为选项)。
很多命令都提供了这两类参数,必要参数使用<参数>表示,而可选参数使用参数** **表示。
譬如 set 命令:

复制代码
set(<variable> <value>... [PARENT_SCOPE])

set 命令用于设置变量,第一个参数 <variable> 和第二个参数 <value> 是必要参数,在参数列表( ... 表示参数个数没有限制)的最后可以添加一个可选参数 PARENT_SCOPE ( PARENT_SCOPE 选项),既然是可选 的,那就不是必须的,根据实际使用情况确定是否需要添加。
在 CMakeLists.txt **中,命令名不区分大小写,可以使用大写字母或小写字母书写命令名,**譬如:

复制代码
project(HELLO) #小写
PROJECT(HELLO) #大写

这俩的效果是相同的,指定的是同一个命令,并没区别;这个主要看个人喜好,个人喜欢用小写字母,主要是为了和变量区分开来,因为 cmake 的内置变量其名称都是使用大写字母组成的。

3. 变量(variable)

在 CMakeLists.txt 文件中可以使用变量,使用 set 命令可以对变量进行设置,譬如:

复制代码
# 设置变量 MY_VAL
set(MY_VAL "Hello World!")

上例中,通过 set 命令对变量 MY_VAL 进行设置,将其内容设置为 "Hello World!" ;
那如何引用这个变 量呢?
这与 Makefile 是相同的,通过 ${MY_VAL} 方式来引用变量,如下所示:

复制代码
#设置变量 MY_VAL
set(MY_VAL "Hello World!")

#引用变量 MY_VAL
message(${MY_VAL})

变量可以分为 cmake 内置变量以及自定义变量。
譬如,上例中所定义的 MY_VAL 就是一个自定义变量;
譬如,在 前面 cmake编译举例中所使用的 LIBRARY_OUTPUT_PATH 和 EXECUTABLE_OUTPUT_PATH 变量则是 cmake 的内置变量,每一个内置变量都有自己的含义,像这样的内置变量还有很多,稍后向大家介绍。

相关推荐
2035去旅行1 天前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希1231 天前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡1 天前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
且从容.1 天前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道1 天前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
且从容.1 天前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落1 天前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨1 天前
WSL2的安装与使用
linux·wsl
微小的鱼1 天前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng1 天前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器