当前位置: 首页 > news >正文

CMake详细使用

1、CMake简介

CMake是一个用于管理源代码的跨平台构建工具

可以方便地根据目标平台和编译工具产生对应的编译文件

主要用于C/C++语言的构建,但是也可以用于其它编程语言的源代码。

如同使用make命令工具解析Makefile文件一样

cmake命令工具依赖于一个CMakeLists.txt的文件

该文件定义了代码的编译规则和目标等信息。

官方文档说明:https://cmake.org/cmake/help/v3.17/index.html

2、CMake 注释

  1. 单行注释 #

# 单行注释
  1. 多行注释 #[[ ]]

#[[ 多行注释多行注释多行注释 ]]

3、CMake 变量

CMake 中所有变量都是 String 类型

  1. set() 声明变量

# set(变量名 变量值)
set(name 小明)

  1. unset() 移除一个变量

# unset(变量名)
unset(name)

  1. ${} 引用变量

# ${变量名}
${name}

  1. message() 打印变量

# message("name = ${变量名}")
message("name = ${name}")

4、CMake列表

列表也是字符串,可以把列表看做是一个特殊的变量,这个变量有多个值。

  1. 列表格式 (设置列表有两种方式)

# set(列表名 值1 值2 ... 值n)
set(list_age 1 2 ... n)# set(列表名 "值1; 值2; 值3")
set(list_age "1;2;3")

5、CMake流程控制

  1. 操作符

优先级:() > 一元 > 二元 > 逻辑

类型

名称

一元

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

  1. 布尔常量值

类型

true

1、ON、YES、TRUE、Y、非0的值

false

0、OFF、NO、FALSE、N、IGNORE、NOTFOUND

空字符串、一-NOTFOUND结尾的字符串

  1. 条件判断 if()

语法:

if(表达式)....
elseif(表达式)...
else(表达式)...
endif()            
  • elseif和else部分是可选的

  • elseif部分可以有多个

  • 缩进和空格对语句的解析没有影响

  1. 循环命令 while()

语法:

while(表达式)...
endwhile()
  • break() 可以跳出整个循环

  • continue() 可以跳出当前循环

  1. 循环遍历 foreach()

循环遍历分为两种:

  • 遍历RANGE:

#循环范围从start到stop,循环增量为step
foreach(循环变量 RANGE start stop step)...
endforeach(循环变量)
  • 遍历LISTS:

foreach(循环遍历 IN LISTS 列表)...
endforeach(循环变量)
  • break() 可以跳出整个循环

  • continue() 可以跳出当前循环

6、CMake自定义函数

语法:

function(<name> arg1 arg2 arg3)...
endfunction(<name>)

调用:

name(arg1 arg2 arg3)

7、CMake自定义宏命令

语法:

macro(<name> arg1 arg2 arg3)...
endmacro(<name>)

调用:

name(arg1 arg2 arg3)

8、CMake常用变量

CMake预设了一些常用变量

这些变量通常会在编写CMakeLists.txt文件时使用到:

变量值

作用

CMAKE_MAJOR_VERSION

cmake 主版本号

CMAKE_MINOR_VERSION

cmake 次版本号

CMAKE_C_FLAGS

设置 C 编译选项

CMAKE_CXX_FLAGS

设置 C++ 编译选项

PROJECT_SOURCE_DIR

工程的根目录

PROJECT_BINARY_DIR

运行 cmake 命令的目录

CMAKE_CURRENT_SOURCE_DIR

当前CMakeLists.txt 所在路径

CMAKE_CURRENT_BINARY_DIR

目标文件编译目录

EXECUTABLE_OUTPUT_PATH

重新定义目标二进制可执行文件的存放位置

LIBRARY_OUTPUT_PATH

重新定义目标链接库文件的存放位置

UNIX

如果为真,表示为UNIX-like的系统,包括AppleOSX和CygWin

WIN32

如果为真,表示为 Windows 系统,包括 CygWin

APPLE

如果为真,表示为 Apple 系统

CMAKE_SIZEOF_VOID_P

表示void*的大小(例如为4或者8),可以使用其来判断当前构建为32位还是64位

CMAKE_CURRENT_LIST_DIR

表示正在处理的CMakeLists.txt文件所在目录的绝对路径

CMAKE_ARCHIVE_OUTPUT_DIRECTORY

用于设置ARCHIVE目标的输出路径

CMAKE_LIBRARY_OUTPUT_DIRECTORY

用于设置LIBRARY目标的输出路径

CMAKE_RUNTIME_OUTPUT_DIRECTORY

用于设置RUNTIME目标的输出路径

9、CMakeLists.txt 常用语法

  1. project 命令:

# 命令语法:project(<projectname> [languageName1 languageName2 ...])
# 设置项目名称 (工程名称为 projectName)
project(projectName)
  1. cmake_minimum_required 命令:

# cmake_minimum_requried(VERSION major[.minor[.patch)
# 设置 CMake 最低版本 (最低版本 3.14)
cmake_minimum_required(VERSION 3.14.0)
  1. aux_source_directory命令:

# aux_source_directory(<dir> <variable>)
# 用于包含源文件目录,dir目录下的所有源文件的名字保存在变量variable中
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src DIR_SRCS)
  1. add_executable命令:

# add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)
# 用于指定从一组源文件source1 source2 ... sourceN 编译出一个可执行文件且命名为name
add_executable(Main $(DIR_SRCS))
  1. add_library命令:

# add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)
# 用于指定从一组源文件 source1 source2 ... sourceN编译出一个库文件且命名为name
add_library(Lib $(DIR_SRCS))
  1. add_dependencies命令:

# add_dependencies(target-name depend-target1 depend-target2 …)
# 用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。
# 这里的目标必须是add_executable、add_library、add_custom_target命令创建的目标
  1. add_subdirectory命令:

# add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 用于添加一个需要进行构建的子目录
add_subdirectory(Lib)
  1. target_link_libraries命令:

# target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)
# 用于指定target需要链接item1 item2 ...。这里target必须已经被创建,链接的item可以是已经存在的target(依赖关系会自动添加)
target_link_libraries(Main Lib)
  1. set命令:

# 用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache(缓存)中。
# set(<variable> <value> [[CACHE <type><docstring> [FORCE]] | PARENT_SCOPE])
set(ProjectName Main)
  1. unset命令:

# unset(<variable> [CACHE])
# 用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除。
unset(VAR CACHE)
  1. message命令:

# message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message todisplay”…)
# 用于输出信息
message(“Hello World”)
  1. include_directories命令:

# include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 用于设定目录,这些设定的目录将被编译器用来查找 include 文件
include_directories(${PROJECT_SOURCE_DIR}/lib)
  1. find_path命令:

# find_path(<VAR> name1 [path1 path2 …])
# 用于查找包含文件name1的路径,如果找到则将路径保存在VAR中(此路径为一个绝对路径),如果没有找到则结果为<VAR>-NOTFOUND.默认情况下,VAR会被保存在Cache中,这时候我们需要清除VAR才可以进行下一次查询(使用unset命令)
find_path(LUA_INCLUDE_PATH lua.h ${LUA_INCLUDE_FIND_PATH})
if(NOT LUA_INCLUDE_PATH)message(SEND_ERROR "Header file lua.h not found")
endif()
  1. find_library命令:

# find_library(<VAR> name1 [path1 path2 …])
# 用于查找库文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),
# 如果没有找到则结果为 <VAR>-NOTFOUND。
# 一个类似的命令 link_directories 已经不太建议使用了
  1. add_definitions命令:

# add_definitions(-DFOO -DBAR …)
# 用于添加编译器命令行标志(选项),通常的情况下我们使用其来添加预处理器定义
add_definitions(-D_UNICODE -DUNICODE)
  1. file命令:

# 此命令提供了丰富的文件和目录的相关操作(这里仅说一下比较常用的)
使用范例:
# 目录的遍历
# GLOB 用于产生一个文件(目录)路径列表并保存在variable 中
# 文件路径列表中的每个文件的文件名都能匹配globbing expressions(非正则表达式,但是类似)
# 如果指定了 RELATIVE 路径,那么返回的文件路径列表中的路径为相对于 RELATIVE 的路径
file(GLOB variable [RELATIVE path][globbing expressions]...)# 获取当前目录下的所有的文件(目录)的路径并保存到 ALL_FILE_PATH 变量中
file(GLOB ALL_FILE_PATH ./*)
# 获取当前目录下的 .h 文件的文件名并保存到ALL_H_FILE 变量中
# 这里的变量CMAKE_CURRENT_LIST_DIR 表示正在处理的 CMakeLists.txt 文件的所在的目录的绝对路径(2.8.3 以及以后版本才支持)

相关文章:

CMake详细使用

1、CMake简介CMake是一个用于管理源代码的跨平台构建工具可以方便地根据目标平台和编译工具产生对应的编译文件主要用于C/C语言的构建&#xff0c;但是也可以用于其它编程语言的源代码。如同使用make命令工具解析Makefile文件一样cmake命令工具依赖于一个CMakeLists.txt的文件该…...

【数据结构与算法】前缀树的实现

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…...

canvas 制作2048

效果展示 对UI不满意可以自行调整&#xff0c;这里只是说一下游戏的逻辑&#xff0c;具体的API调用不做过多展示。 玩法分析 2048 的玩法非常简单&#xff0c;通过键盘的按下&#xff0c;所有的数字都向着同一个方向移动&#xff0c;如果出现两个相同的数字&#xff0c;就将…...

playwright: 全局修改页面等待超时时间

等待超时时间默认是30s, 可以通过以下几个方法设置&#xff1a; browser_context.set_default_navigation_timeout()browser_context.set_default_timeout()page.set_default_navigation_timeout()page.set_default_timeout() set_default_navigation_timeout set_default_n…...

C++类和对象(中)

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 I do not believe in taking the right decision. I take a decision and make it right. 我不相信什么正确的决定。我都是先做决定&#xff0c;然后把…...

Docker安装EalasticSearch、Kibana,安装Elasticvue插件

使用Docker快速安装部署ES和Kibana的前提&#xff1a;首先需要确保已经安装了Docker环境。 如果没有安装Docker的话&#xff0c;先在Linux上安装Docker。 有了Docker环境后&#xff0c;就可以使用Docker安装部署ES和Kibana了 一、安装ES 1、拉取EalasticSearch镜像 docker p…...

算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间

算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间 无重叠区间 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互…...

c/c++开发,无可避免的文件访问开发案例

一、缓存文件系统 ANSI C标准中的C语言库提供了fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等标准函数&#xff0c;这些函数在不同的操作系统中应该调用不同的内核API&#xff0c;从而支持开发者跨平台实现对文件的访问。 在Lin…...

MySQL学习笔记

MySQL学习笔记一、基础配置二、数据库操作三、表的操作1.创建表2.表选项3.查看表4.修改表5.删除表6.复制表7.检查优化修复表四、数据操作基础增删改查五、字符集编码六、数据类型&#xff08;列类型&#xff09;1.数值类型2.字符串类型3.日期时间类型4.枚举和集合七、列属性&am…...

ccs导入工程失败的处理方法

文章目录当导入CCS新工程时出现下述错误怎么办&#xff1f;方法一 从TI官网下载安装包进行安装&#xff0c;下载链接&#xff1a;软件下载完成 安装路径为上面的文件夹点击安装完成后&#xff0c;导入安装路径&#xff0c;并点击Refresh按钮&#xff0c;依据路径进行更新&#…...

探针台常见的故障及解决方法

症状、 可能原因、 解决方法 移动样品后画面变模糊 —显微镜不垂直&#xff0c;调垂直显微镜 样品台不水平 —调水平样品台 显微镜视场亮度不足&#xff0c;边缘切割或看不到像—转换器不在定位位置上 把转换器转到定位位置上 管镜转盘不在定位位置上 —把管镜转盘转到定…...

域内资源探测

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;内网安全 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0c;永远是…...

c# 将数据导出到EXCEL文件

第一步&#xff1a;项目中加入引用。 在鼠标右击项目&#xff0c;点击【添加】弹出菜单列表&#xff0c;选择【项目引用】弹出【引用管理器】对话框&#xff0c;选择【COM】-【Microsoft Excel 16.0 Object Library】&#xff0c;如图所示&#xff1a; 第二步&#xff0c;编辑…...

微服务 分片 运维管理

微服务 分片 运维管理分片分片的概念分片案例环境搭建案例改造成任务分片Dataflow类型调度代码示例运维管理事件追踪运维平台搭建步骤使用步骤分片 分片的概念 当只有一台机器的情况下&#xff0c;给定时任务分片四个&#xff0c;在机器A启动四个线程&#xff0c;分别处理四个…...

批量占满TEMP表空间问题处理与排查

批量占满TEMP表空间问题处理与排查应急处置问题排查查看占用TEMP表空间高的SQL获取目标SQL执行计划方法一&#xff1a;EXPLAIN PLAN FOR方法二&#xff1a;DBMS_XPLAN.DISPLAY_CURSOR方法三&#xff1a;DBMS_XPLAN.DISPLAY_AWR方法四&#xff1a;AUTOTRACE数据库跑批任务占满TE…...

Pytorch中的tensor和variable

Tensor与Variable pytorch两个基本对象&#xff1a;Tensor&#xff08;张量&#xff09;和Variable&#xff08;变量&#xff09; 其中&#xff0c;tensor不能反向传播&#xff0c;variable可以反向传播&#xff08;forword&#xff09;。 反向传播是为了让神经网络更新前面…...

暗月内网渗透实战——项目七

首先环境配置 VMware的网络配置图 环境拓扑图 开始渗透 信息收集 使用kali扫描一下靶机的IP地址 靶机IP&#xff1a;192.168.0.114 攻击机IP&#xff1a;192.168.0.109 获取到了ip地址之后&#xff0c;我们扫描一下靶机开放的端口 靶机开放了21,80,999,3389,5985,6588端口…...

【Java 面试合集】描述下Objec类中常用的方法(未完待续中...)

描述下Objec类中常用的方法 1. 概述 首先我们要知道Object 类是所有的对象的基类&#xff0c;也就是所有的方法都是可以被重写的。 那么到底哪些方法是我们常用的方法呢&#xff1f;&#xff1f;&#xff1f; cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringw…...

SQLSERVER 的 truncate 和 delete 有区别吗?

一&#xff1a;背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 &#xff0c;这是一个很有意思的话题&#xff0c;本篇我就试着来回答一下&#xff0c;如果下次大家遇到这类问题&#xff0c;我的答案应该可以帮你成功度过吧。 二&#xff1…...

【C++】CC++内存管理

就是你被爱情困住了&#xff1f;Wake up bro&#xff01; 文章目录一、C/C内存分布二、C语言中动态内存管理方式三、C中内存管理方式1.new和delete操作内置类型2.new和delete操作自定义类型&#xff08;仅限vs的底层实现机制&#xff0c;new和delete一定要匹配使用&#xff0c;…...

数据预处理之图像去空白

数据预处理之图像去空白图像去空白介绍方法边缘检测阈值处理形态学图像剪切图像去空白 介绍 图像去空白是指在图像处理中去除图像中的空白区域的过程。空白区域通常是指图像中的白色或其他颜色&#xff0c;其不包含有用的信息。去空白的目的是为了节省存储空间、提高图像处理…...

真的麻了,别再为难软件测试员了......

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…...

2月9日,30秒知全网,精选7个热点

///货拉拉将推出同城门到门跑腿服务 据介绍&#xff0c;两轮电动车将成为该业务的主要运力&#xff0c;预计将于3月中旬全面开放骑手注册和用户人气征集活动&#xff0c;并根据人气和线上骑手注册情况选择落地城市&#xff0c;于4月正式开放服务和骑手接单 ///三菱、乐天和莱茵…...

球面坐标系下的三重积分

涉及知识点 三重积分球面坐标系点火公式一些常见积分处理手法 球面坐标系定义 球面坐标系由方位角φ\varphiφ、仰角θ\thetaθ和距离rrr构成 直角坐标系(x,y,z)(x,y,z)(x,y,z)到球面坐标系的(r,φ,θ)(r,\varphi,\theta)(r,φ,θ)的转化规则如下&#xff1a; {xrsin⁡φco…...

谷歌 Jason Wei | AI 研究的 4 项基本技能

文章目录 一、前言二、主要内容三、总结CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 原文作者为 Jason Wei,2020 年达特茅斯学院本科毕业,之后加入 Google Brain 工作。 Jason Wei 的博客主页:https://www.jasonwei.net/ 其实我不算是一个特别有经验的研究员…...

excel数据整理:合并计算快速查看人员变动

相信大家平时在整理数据时&#xff0c;都会对比数据是否有重复的地方&#xff0c;或者该数据与源数据相比是否有增加或者减少。数据量不大还好&#xff0c;数据量大的话&#xff0c;对比就比较费劲了。接下来我们将进入数据对比系列课程的学习。该系列一共有两篇教程&#xff0…...

vit-pytorch实现 MobileViT注意力可视化

项目链接 https://github.com/lucidrains/vit-pytorch 注意一下参数设置&#xff1a; Parameters image_size: int. Image size. If you have rectangular images, make sure your image size is the maximum of the width and heightpatch_size: int. Number of patches. im…...

Python将字典转换为csv

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...

EasyX精准帧率控制打气球小游戏

&#x1f386;音乐分享 New Boy —— 房东的猫 之前都用Sleep&#xff08;&#xff09;来控制画面帧率&#xff0c;忽略了绘制画面的时间 如果绘制画面需要很长的时间&#xff0c;那么就不能忽略了。 并且Sleep&#xff08;&#xff09;函数也不是特别准确&#xff0c;那么就…...

你知道 GO 中什么情况会变量逃逸吗?

你知道 GO 中什么情况会变量逃逸吗&#xff1f;首先我们先来看看什么是变量逃逸 Go 语言将这个以前我们写 C/C 时候需要做的内存规划和分配&#xff0c;全部整合到了 GO 的编译器中&#xff0c;GO 中将这个称为 变量逃逸 GO 通过编译器分析代码的特征和代码的生命周期&#x…...

python可以做的网站论文/seo搜索引擎优化推荐

2019 IDEA 多模块项目查看各模块依赖导入情况Project Structure 详细介绍 一、前言 使用IDEA工具创建了多模块项目后遇到了下面的的问题&#xff1a; ①、在项目中使用Gradle引入了依赖包&#xff0c;但是在模块中使用依赖包时候总是提示缺失依赖包。 ②、项目中导入第三发…...

不同类型网站比较/seo研究协会网是干什么的

目录 1、下载 2、解压 3、编译安装 1)修改代码 a.注释#if (APR_MAJOR_VERSION < 1)代码&#xff1a; b.把所有的remote_addr替换成client_addr 2&#xff09;编译 ​4、配置apache 1) httpd.conf 加上LoadModule bw_module modules/mod_bw.so 2) 网站配置 5、测…...

购物网页版/企业网站关键词优化

听说&#xff0c;你很喜欢猴子吃桃子的时候。你知道猴子吃桃子应该怎样形容吗&#xff1f; 当然&#xff0c;在编程的世界里&#xff0c;这将会是非常有趣的&#xff01; 今天要与你分享的是就是经典例题——猴子吃桃子的问题&#xff0c;一起来看看吧~ 经典例题&#xff1a…...

工程公司logo图片大全集/seo项目经理

如图&#xff0c;拿到一个openwrt路由器我们第一步要远程控制。 这里在买了两块wifi-robots wifi视频模块。 0首先说下这个WIIF的信息 淘宝购买链接 https://item.taobao.com/item.htm?spma312a.7700824.w5001-18055431271.3.18644705m9g8Qz&id555120245987&scenetao…...

怎么做一淘宝客网站/网址注册

局域网 ARP 欺骗原理详解 ARP 欺骗是一种以 ARP 地址解析协议为基础的一种网络攻击方式, 那么什么是 ARP 地址解析协议: 首先我们要知道, 一台电脑主机要把以太网数据帧发送到同一局域网的另外一台主机, 它的底层是通过 48bit 的 Mac 地址来确定目的接口的, 但是我们在应用层是…...

wordpress 文件列表/宁波网站seo诊断工具

今天来和大家分享下这个 ElasticSearch 中必须要掌握的几个概念。&#x1f447; 整体关系 老规矩~ 先从整体上认识认识他们~ &#x1f604; 每个 Index 由一个或者多个 shard 组成&#xff0c;分布在不同的 node &#xff0c;document 由 Field 组成&#xff0c;存储在这些 sh…...