5、cmake的简单认识及CMakeLists.txt的编写语法

news2024/9/23 11:18:01

文章目录

  • 1、cmake是什么
    • (1)cmake的两大功能
  • 2、CMakeLists.txt常用命令(即如何编写CMakeLists.txt文件)
    • (1)cmake常见预定义
      • 1)常见的预定义变量
      • 2)系统信息预定义变量
      • 3)开关选项
    • (2)常见语法
      • 1)CMAKE_MINIMUM_REQUIRED
      • 2)PROJECT(name)
      • 3)SET:向某个变量添加某些值
      • 4)ADD_SUBDIRECTORY
      • 5)INCLUDE_DIRECTORIES
      • 6))ADD_EXECUTABLE
      • 7)ADD_LIBRARY:添加库
      • 8)LINK_DIRECTORIES:用于添加外部库的搜索路径
      • 9)TARGET_LINK_LIBRARIES
      • 10)MESSAGE:向终端输出用户定义的信息或变量值
      • 11)AUX_SOURCE_DIRECTORY
    • (3)基本控制语法
      • 1)IF(一定要有ENDIF与IF对应)
      • 2)WHILE(一定要有ENDWHILE与WHILE对应)
      • 3)FOREACH(每个FOREACH都需要一个ENDFOREACH()与之匹配)

1、cmake是什么

CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。
CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下automake

Cmake是用来makefile的一个工具:即读入所有源文件之后,自动生成makefile。
在这里插入图片描述

(1)cmake的两大功能

1)配置和生成各大平台的工程(vs的vcxproj,Qt的Pro):比如设置输出目录,设置编译对象的debug后缀,设置源码在工程中的那个文件夹(Filter),配置需要依赖的第三方的头文件目录,库目录等等属性

2)生成makefile文件:计算机编译源文件的时候是一条指令一条指令的发送给编译器执行的,这样效率很低下,所以就产生了一种文件,把所有的命令写到一个文件中,这个文件就是makefile。CMake生成了这个makeFile之后,各大平台的编译器都会拿到这个makeFile然后解析它。将他的命令解析出来一条一条执行。(在linux/Unix平台,生成makefile,在苹果平台可以生成Xcode,在windows平台,可以生成MSVC的工程文件)

2、CMakeLists.txt常用命令(即如何编写CMakeLists.txt文件)

在CMake中,大小写、甚至大小写混合的命令都是被支持的。

(1)cmake常见预定义

1)常见的预定义变量

PROJECT_SOURCE_DIR:工程根目录;
PROJECT_BINARY_DIR:运行cmake命令的目录。建议定义${PROJECT_SOURCE_DIR}/build下
CMAKE_INCLUDE_PATH:环境变量,非cmake变量;
CMAKE_LIBRARY_PATH:环境变量;
CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在路径;
CMAKE_CURRENT_BINARY_DIR:target编译目录;
使用ADD_SURDIRECTORY指令可以更改该变量的值;
SET(EXECUTABLE_OUTPUT_PATH < dir >) 指令不会对该变量有影响,但改变了最终目标文件的存储路径;

CMAKE_CURRENT_LIST_FILE:输出调用该变量的CMakeLists.txt的完整路径;
CMAKE_CURRENT_LIST_LINE:输出该变量所在的行;
CMAKE_MODULE_PATH:定义自己的cmake模块所在路径;
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置(使用set指令可对其进行设置)
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置;
PROJECT_NAME:返回由PROJECT指令定义的项目名称;
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用来控制IF…ELSE…语句的书写方式;

2)系统信息预定义变量

CMAKE_MAJOR_VERSION cmake主版本号,如2.8.6中的2
CMAKE_MINOR_VERSION cmake次版本号,如2.8.6中的8
CMAKE_PATCH_VERSION cmake补丁等级,如2.8.6中的6
CMAKE_SYSTEM 系统名称,例如Linux-2.6.22
CMAKE_SYSTEM_NAME 不包含版本的系统名,如Linux
CMAKE_SYSTEM_VERSION 系统版本,如2.6.22
CMAKE_SYSTEM_PROCESSOR 处理器名称,如i686
UNIX 在所有的类UNIX平台为TRUE,包括OS X和cygwin
WIN32 在所有的win32平台为TRUE,包括cygwin

3)开关选项

BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库。
CMAKE_C_FLAGS 设置C编译选项
CMAKE_CXX_FLAGS 设置C++编译选项

(2)常见语法

1)CMAKE_MINIMUM_REQUIRED

该语句一般都可以放置在CMakeLists.txt的开头,用于说明CMake最低版本要求在这里插入图片描述

2)PROJECT(name)

该指令一般置于CMakeLists.txt的开头,定义了工程的名称name。但项目最终编译生成的可执行文件并不一定是这个项目名称,而是由另一条命令确定的
在这里插入图片描述

执行完这条指令后将会自动创建如上的两个变量(这时候前面简述的PROJECT_BINARY_DIR = < projectname >_BINARY_DIR,PROJECT_SOURCE_DIR = < projectname >_SOURCE_DIR)

a)内部构建与外部构建(在CMakeLists.txt所在目录下,有两种执行cmake的方法)
在这里插入图片描述
b)第一种方法是内部构建,第二种方法是外部构建。上述两种方法中,最大不同在于cmake与make的工作路径不同。

c)内部构建:cmake生成的中间文件和可执行文件都会存放在项目目录中

d)外部构建:中间文件与可执行文件都存放在build目录中

e)推荐使用外部构建的方法:能够最大限度的保持了代码目录的整洁,生成、编译与安装是不同于项目目录的其他目录中,在外部构建方法下,PROJECT_SOURCE_DIR指向目录与内部构建相同,为CMakeLists.txt所在根目录;而PROJECT_BINARY_DIR不同,它指向CMakeLists.txt所在根目录下的build目录

3)SET:向某个变量添加某些值

在这里插入图片描述

4)ADD_SUBDIRECTORY

用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
在这里插入图片描述

5)INCLUDE_DIRECTORIES

向工程添加多个特定的头文件搜索路径,路径之间用空格分隔。
在这里插入图片描述

6))ADD_EXECUTABLE

该命令给出源文件名称,并指出需要编译出的可执行文件名。
在这里插入图片描述

7)ADD_LIBRARY:添加库

在这里插入图片描述

8)LINK_DIRECTORIES:用于添加外部库的搜索路径

在这里插入图片描述

9)TARGET_LINK_LIBRARIES

指定链接目标文件时需要链接的外部库,效果类似于gcc编译参数-L,解决外部库依赖的问题。
在这里插入图片描述

10)MESSAGE:向终端输出用户定义的信息或变量值

在这里插入图片描述

11)AUX_SOURCE_DIRECTORY

查找某个路径下的所有源文件,并将源文件列表存储到一个变量中
在这里插入图片描述

(3)基本控制语法

1)IF(一定要有ENDIF与IF对应)

a)语法格式
在这里插入图片描述
b)基本用法
IF (expression), expression不为:空,0,N,NO,OFF,FALSE,NOTFOUND或< var >_NOTFOUND,为真;
IF (not exp), 与上面相反;
IF (var1 AND var2)
IF (var1 OR var2)
IF (COMMAND cmd) 如果cmd确实是命令并可调用,为真;
IF (EXISTS dir) 如果目录存在,为真;
IF (EXISTS file) 如果文件存在,为真;
IF (file1 IS_NEWER_THAN file2),当file1比file2新,或file1/file2中有一个不存在时为真,文件名需使用全路径;
IF (IS_DIRECTORY dir) 当dir是目录时,为真;
IF (DEFINED var) 如果变量被定义,为真;
IF (var MATCHES regex) 此处var可以用var名,也可以用${var};
IF (string MATCHES regex) 当给定变量或字符串能匹配正则表达式regex时,为真;

2)WHILE(一定要有ENDWHILE与WHILE对应)

语法格式
在这里插入图片描述
判断条件语句参考IF

3)FOREACH(每个FOREACH都需要一个ENDFOREACH()与之匹配)

a)列表语法
在这里插入图片描述

b)范围语法
在这里插入图片描述

c)范围步进语法
在这里插入图片描述
参考链接:https://www.jianshu.com/p/9d246e4071d4

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

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

相关文章

开发者笑疯了! LLaMa惊天泄露引爆ChatGPT平替狂潮,开源LLM领域变天

来源: 新智源 微信号&#xff1a;AI-era Meta的LLaMA模型开源&#xff0c;让文本大模型迎来了Stable Diffustion时刻。谁都没想 谁能想到&#xff0c;一次意外的LLaMA泄漏&#xff0c;竟点燃了开源LLM领域最大的创新火花。 一系列表现出色的ChatGPT开源替代品——「羊驼家族」…

Linux系统网络传输之端口详解

Linux系统网络传输之端口详解 1、端口的概念2、安装namp3、查看端口占用情况4、安装net-tools5、查看指定端口占用情况 1、端口的概念 计算机程序之间的通讯&#xff0c;通过IP只能锁定计算机&#xff0c;但是无法锁定具体的程序。通过端口可以锁定计算机上具体的程序&#xf…

《花雕学AI》深度测试ChatGPT国内镜像站:超简单提示词的猫娘角色扮演,真的好神奇啊!

偶然看过一篇讲解如何使用ChatGPT调教猫娘的文章&#xff0c;有六个步骤&#xff0c;许许多多的调教提示语&#xff0c;让我感觉这是一件非常复杂与专业的事情。今天有空&#xff0c;于是就想先从简单的开始尝试一下。我使用了最简单的提示词&#xff1a;”ChatGPT角色扮演猫娘…

分布式事务Seata实践入门

1 前言 现在应用基本上都是分布式部署&#xff0c;那么针对分布式事务问题&#xff0c;也有对应的解决方案。经过简单的调研&#xff0c;最后选择了阿里的 Seata 组件&#xff0c;来实现分布式事务。 Seata是2019年1月份&#xff0c;蚂蚁金服和阿里巴巴共同开源的分布式事务解…

(TinkSystem SR650)安装服务器操作系统(Windows Server 2022)步骤和相关概念

&#xff08;TinkSystem SR650&#xff09;安装服务器操作系统&#xff08;Windows Server 2022&#xff09;步骤和相关概念 服务器操作系统安装步骤 记录一下服务器操作系统安装过程&#xff0c;虽然简单但还是有一些坑需要注意&#xff0c;本次使用的是联想服务器ThinkSyst…

VS2019中Ctrl+左键不起作用和控制台不驻留(cmd窗口闪退)

1、关于Ctrl左键不起作用 解决&#xff1a;在线装个插件就行。 工具>>扩展和更新 联机>>VS库>>所搜插件“GO TO Definition” 安装&#xff0c;重启VS即可。 2、关于控制台不驻留 当然这个问题解决方案有很多&#xff0c;这个是首选吧

[Java·算法·中等]LeetCode105. 从前序与中序遍历序列构造二叉树

每天一题&#xff0c;防止痴呆 前言题目示例分析思路1题解1分析思路2题解2 &#x1f449;️ 力扣原文 前言 二叉树前序遍历的顺序为&#xff1a; 先遍历根节点&#xff1b; 随后递归地遍历左子树&#xff1b; 最后递归地遍历右子树。 二叉树中序遍历的顺序为&#xff1a; 先递…

HCIP-6.9BGP路由反射器原理与配置

路由反射器原理与配置 1、路由反射器概念1.1、路由反射器原理&#xff1a;1.2、多集群路由反射器1.3、备份路由反射器2、路由反射器配置3、路由反射器防环机制 1、路由反射器概念 IBGP的水平分割&#xff0c;IBGP 1只能update一跳&#xff0c;就是说在IBGP 2 设备收到IBGP 1设…

【RocketMQ】事务的实现原理

事务的使用 RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中&#xff0c;假如某个场景下需要对数据库的多张表进行操作&#xff0c;为了保证数据的一致性&#xff0c;一般会使用事务&#xff0c;将所有的操作全部提交或者在出错的时候全部回滚。以创建订单…

12-RabbitMQ

一 RabbitMQ概念 1 MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通过第三方转述对…

ObjectBox一种基于中心点的无锚点目标检测方法

ObjectBox: From Centers to Boxes for Anchor-Free Object Detection 论文地址&#xff1a;https://arxiv.org/pdf/2207.06985.pdf 官方代码&#xff1a;https://github.com/MohsenZand/ObjectBox 基于中心点的无锚点目标检测方法是一种目标检测方法&#xff0c;其思路是将目…

DJ编曲用什么软件,DJ编曲教需要哪些步骤

随着现在人们的生活水平不断提高&#xff0c;我们的精神生活也越来越丰富&#xff0c;对于现在的年轻人来说&#xff0c;DJ舞曲是一个较受欢迎的领域&#xff0c;有许多年轻人对DJ这个职业感兴趣&#xff0c;想要深入了解DJ编曲这份工作&#xff0c;那么今天我们就来说一说DJ编…

300元买什么蓝牙耳机性价比高?300左右性价比高的蓝牙耳机推荐

TWS耳机已经成了很多人生活的必需品&#xff0c;如今的耳机在设计、功能、体验等方面都非常完善&#xff0c;拥有一副TWS耳机似乎已经成为时尚的标志&#xff0c;尤其是年轻群体&#xff0c;耳机既是听歌、娱乐的主力设备&#xff0c;也是穿搭风格、个性的体现&#xff0c;下面…

JDBC事务 Hibernate事务 EJB事务详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;JDBC事务 Hibernate事务 EJB事务详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你…

【学习笔记】Integral Human Pose Regression

【学习资料】一文总结Integral Pose Regression方法的方方面面 - 知乎&#xff08;总结的很到位&#xff0c;一定要去看&#xff09; 1.两种基本方法的对比 1.解码方式 softmax和argmax的区别&#xff1a; 由于深度神经网络中的下采样步骤&#xff0c;热图的分辨率低于输入…

如何在电脑本地下载镜像重装系统

现在网上随处可以下载操作系统&#xff0c;下载下来的是镜像系统&#xff0c;很多朋友都不知道电脑镜像重装系统是什么意思&#xff0c;怎么用镜像重装系统&#xff0c;今天小编就给大家带来了电脑镜像重装系统是什么意思的相关解答&#xff0c;一起往下看。 电脑镜像重装系统是…

从FPGA说起的深度学习(七)-循环并行化

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

不良事件上报系统源码开发,不良事件上报系统源码

不良事件管理系统源码&#xff0c;有演示&#xff0c;支持二开&#xff0c;可正常上线运营。 相关技术&#xff1a;PHPvscodevue2elementlaravel8mysql5.7 文末获取联系&#xff01; 医院安全不良事件上报系统&#xff0c;对患者安全&#xff08;不良&#xff09;事件实施全过…

微分方程的基本概念(通解、特解,线素场)

微分方程的基本概念(通解、特解&#xff0c;线素场)1 微分方程的定义 同学们大家好&#xff0c;今天我们来学习微分方程的基础概念。 微分方程就是含有导数的方程&#xff0c;例如&#xff1a; 它就含有导数 &#xff0c;因此它就是一个微分方程。而我们知道导数的写法不止一…

androidstudio虚拟机运行react-native项目踩坑指南

androidstudio虚拟机运行react-native项目踩坑指南安装JDK安装android studio配置环境变量新建虚拟机新建RN项目运行项目本文详细的记录了照react-native官网文档运行项目踩到的所有坑&#xff0c;诚然&#xff0c;官网只介绍了每一步&#xff0c;最后确实是可以正常运行项目&a…