CMake详细使用
1、CMake简介
CMake是一个用于管理源代码的跨平台构建工具
可以方便地根据目标平台和编译工具产生对应的编译文件
主要用于C/C++语言的构建,但是也可以用于其它编程语言的源代码。
如同使用make命令工具解析Makefile文件一样
cmake命令工具依赖于一个CMakeLists.txt的文件
该文件定义了代码的编译规则和目标等信息。
官方文档说明:https://cmake.org/cmake/help/v3.17/index.html
2、CMake 注释
- 单行注释 # 
# 单行注释- 多行注释 #[[ ]] 
#[[ 多行注释多行注释多行注释 ]]3、CMake 变量
CMake 中所有变量都是 String 类型
- set() 声明变量 
# set(变量名 变量值)
set(name 小明)- unset() 移除一个变量 
# unset(变量名)
unset(name)- ${} 引用变量 
# ${变量名}
${name}- message() 打印变量 
# message("name = ${变量名}")
message("name = ${name}")4、CMake列表
列表也是字符串,可以把列表看做是一个特殊的变量,这个变量有多个值。
- 列表格式 (设置列表有两种方式) 
# set(列表名 值1 值2 ... 值n)
set(list_age 1 2 ... n)# set(列表名 "值1; 值2; 值3")
set(list_age "1;2;3")5、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 | 
- 布尔常量值 
| 类型 | 值 | 
| true | 1、ON、YES、TRUE、Y、非0的值 | 
| false | 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND 空字符串、一-NOTFOUND结尾的字符串 | 
- 条件判断 if() 
语法:
if(表达式)....
elseif(表达式)...
else(表达式)...
endif()            - elseif和else部分是可选的 
- elseif部分可以有多个 
- 缩进和空格对语句的解析没有影响 
- 循环命令 while() 
语法:
while(表达式)...
endwhile()- break() 可以跳出整个循环 
- continue() 可以跳出当前循环 
- 循环遍历 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 常用语法
- project 命令: 
# 命令语法:project(<projectname> [languageName1 languageName2 ...])
# 设置项目名称 (工程名称为 projectName)
project(projectName)- cmake_minimum_required 命令: 
# cmake_minimum_requried(VERSION major[.minor[.patch)
# 设置 CMake 最低版本 (最低版本 3.14)
cmake_minimum_required(VERSION 3.14.0)- aux_source_directory命令: 
# aux_source_directory(<dir> <variable>)
# 用于包含源文件目录,dir目录下的所有源文件的名字保存在变量variable中
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src DIR_SRCS)- add_executable命令: 
# add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)
# 用于指定从一组源文件source1 source2 ... sourceN 编译出一个可执行文件且命名为name
add_executable(Main $(DIR_SRCS))- add_library命令: 
# add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)
# 用于指定从一组源文件 source1 source2 ... sourceN编译出一个库文件且命名为name
add_library(Lib $(DIR_SRCS))- add_dependencies命令: 
# add_dependencies(target-name depend-target1 depend-target2 …)
# 用于指定某个目标(可执行文件或者库文件)依赖于其他的目标。
# 这里的目标必须是add_executable、add_library、add_custom_target命令创建的目标- add_subdirectory命令: 
# add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 用于添加一个需要进行构建的子目录
add_subdirectory(Lib)- target_link_libraries命令: 
# target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)
# 用于指定target需要链接item1 item2 ...。这里target必须已经被创建,链接的item可以是已经存在的target(依赖关系会自动添加)
target_link_libraries(Main Lib)- set命令: 
# 用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache(缓存)中。
# set(<variable> <value> [[CACHE <type><docstring> [FORCE]] | PARENT_SCOPE])
set(ProjectName Main)- unset命令: 
# unset(<variable> [CACHE])
# 用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除。
unset(VAR CACHE)- message命令: 
# message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message todisplay”…)
# 用于输出信息
message(“Hello World”)- include_directories命令: 
# include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 用于设定目录,这些设定的目录将被编译器用来查找 include 文件
include_directories(${PROJECT_SOURCE_DIR}/lib)- 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()- find_library命令: 
# find_library(<VAR> name1 [path1 path2 …])
# 用于查找库文件 name1 的路径,如果找到则将路径保存在 VAR 中(此路径为一个绝对路径),
# 如果没有找到则结果为 <VAR>-NOTFOUND。
# 一个类似的命令 link_directories 已经不太建议使用了- add_definitions命令: 
# add_definitions(-DFOO -DBAR …)
# 用于添加编译器命令行标志(选项),通常的情况下我们使用其来添加预处理器定义
add_definitions(-D_UNICODE -DUNICODE)- 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语言的构建,但是也可以用于其它编程语言的源代码。如同使用make命令工具解析Makefile文件一样cmake命令工具依赖于一个CMakeLists.txt的文件该…...
 
【数据结构与算法】前缀树的实现
🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…...
 
canvas 制作2048
效果展示 对UI不满意可以自行调整,这里只是说一下游戏的逻辑,具体的API调用不做过多展示。 玩法分析 2048 的玩法非常简单,通过键盘的按下,所有的数字都向着同一个方向移动,如果出现两个相同的数字,就将…...
playwright: 全局修改页面等待超时时间
等待超时时间默认是30s, 可以通过以下几个方法设置: 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++类和对象(中)
✨个人主页: Yohifo 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 I do not believe in taking the right decision. I take a decision and make it right. 我不相信什么正确的决定。我都是先做决定,然后把…...
 
Docker安装EalasticSearch、Kibana,安装Elasticvue插件
使用Docker快速安装部署ES和Kibana的前提:首先需要确保已经安装了Docker环境。 如果没有安装Docker的话,先在Linux上安装Docker。 有了Docker环境后,就可以使用Docker安装部署ES和Kibana了 一、安装ES 1、拉取EalasticSearch镜像 docker p…...
 
算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间
算法训练营 day39 贪心算法 无重叠区间 划分字母区间 合并区间 无重叠区间 435. 无重叠区间 - 力扣(LeetCode) 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互…...
 
c/c++开发,无可避免的文件访问开发案例
一、缓存文件系统 ANSI C标准中的C语言库提供了fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等标准函数,这些函数在不同的操作系统中应该调用不同的内核API,从而支持开发者跨平台实现对文件的访问。 在Lin…...
MySQL学习笔记
MySQL学习笔记一、基础配置二、数据库操作三、表的操作1.创建表2.表选项3.查看表4.修改表5.删除表6.复制表7.检查优化修复表四、数据操作基础增删改查五、字符集编码六、数据类型(列类型)1.数值类型2.字符串类型3.日期时间类型4.枚举和集合七、列属性&am…...
 
ccs导入工程失败的处理方法
文章目录当导入CCS新工程时出现下述错误怎么办?方法一 从TI官网下载安装包进行安装,下载链接:软件下载完成 安装路径为上面的文件夹点击安装完成后,导入安装路径,并点击Refresh按钮,依据路径进行更新&#…...
 
探针台常见的故障及解决方法
症状、 可能原因、 解决方法 移动样品后画面变模糊 —显微镜不垂直,调垂直显微镜 样品台不水平 —调水平样品台 显微镜视场亮度不足,边缘切割或看不到像—转换器不在定位位置上 把转换器转到定位位置上 管镜转盘不在定位位置上 —把管镜转盘转到定…...
域内资源探测
✅作者简介:CSDN内容合伙人、信息安全专业在校大学生🏆 🔥系列专栏 :内网安全 📃新人博主 :欢迎点赞收藏关注,会回访! 💬舞台再大,你不上台,永远是…...
 
c# 将数据导出到EXCEL文件
第一步:项目中加入引用。 在鼠标右击项目,点击【添加】弹出菜单列表,选择【项目引用】弹出【引用管理器】对话框,选择【COM】-【Microsoft Excel 16.0 Object Library】,如图所示: 第二步,编辑…...
 
微服务 分片 运维管理
微服务 分片 运维管理分片分片的概念分片案例环境搭建案例改造成任务分片Dataflow类型调度代码示例运维管理事件追踪运维平台搭建步骤使用步骤分片 分片的概念 当只有一台机器的情况下,给定时任务分片四个,在机器A启动四个线程,分别处理四个…...
批量占满TEMP表空间问题处理与排查
批量占满TEMP表空间问题处理与排查应急处置问题排查查看占用TEMP表空间高的SQL获取目标SQL执行计划方法一:EXPLAIN PLAN FOR方法二:DBMS_XPLAN.DISPLAY_CURSOR方法三:DBMS_XPLAN.DISPLAY_AWR方法四:AUTOTRACE数据库跑批任务占满TE…...
Pytorch中的tensor和variable
Tensor与Variable pytorch两个基本对象:Tensor(张量)和Variable(变量) 其中,tensor不能反向传播,variable可以反向传播(forword)。 反向传播是为了让神经网络更新前面…...
 
暗月内网渗透实战——项目七
首先环境配置 VMware的网络配置图 环境拓扑图 开始渗透 信息收集 使用kali扫描一下靶机的IP地址 靶机IP:192.168.0.114 攻击机IP:192.168.0.109 获取到了ip地址之后,我们扫描一下靶机开放的端口 靶机开放了21,80,999,3389,5985,6588端口…...
 
【Java 面试合集】描述下Objec类中常用的方法(未完待续中...)
描述下Objec类中常用的方法 1. 概述 首先我们要知道Object 类是所有的对象的基类,也就是所有的方法都是可以被重写的。 那么到底哪些方法是我们常用的方法呢??? cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringw…...
 
SQLSERVER 的 truncate 和 delete 有区别吗?
一:背景 1. 讲故事 在面试中我相信有很多朋友会被问到 truncate 和 delete 有什么区别 ,这是一个很有意思的话题,本篇我就试着来回答一下,如果下次大家遇到这类问题,我的答案应该可以帮你成功度过吧。 二࿱…...
 
【C++】CC++内存管理
就是你被爱情困住了?Wake up bro! 文章目录一、C/C内存分布二、C语言中动态内存管理方式三、C中内存管理方式1.new和delete操作内置类型2.new和delete操作自定义类型(仅限vs的底层实现机制,new和delete一定要匹配使用,…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
 
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
 
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
 
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
 
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
 
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
