笨蛋学C++ 之 CMake的使用
CMake
生成可执行程序的流程
- 预处理(-E参数 宏替换等)
- 编译 gcc/msvc/clang(-S参数)
- 汇编(-C参数 linux生成.o文件、windows生成.obj文件)
- 连接(将多个二进制文件连接生成一个可执行的文件)
CMake命令执行流程
- 编写CMakeLists.txt文件,进行配置
- cmake——minimum_required(VERSION 3.20) #最小版本
- project(HELLO) #项目名
- add_executable(Hello hello.cpp) #由源文件生成可执行程序
- cmake -B build
- 创建build并在此目录下生成makefile或其他文件
- cmake --build build
- 生成项目
安装CMake
- sudo yum update
- sudo yum install epel-release
//若装不上报错 未找到匹配的参数: epel-release 错误:没有任何匹配: epel-release
//则执行命令 yum clean all
在官网下载:https://cmake.org/download/
找到 Linux x86_64 点击下载 cmake-3.29.2-linux-x86_64.tar.gz
然后上传该文件到根目录下,这里我用的xftp
- cd /
- ls 就会看到上传的文件
- cd /usr/local/bin/
- mkdir cmake
- cd /
- cd cmake-3.29.2-linux-x86_64
- cp -r ./* /usr/local/bin/cmake/
- vim ~/.bashrc
在最下面输入:export PATH=$PATH:/usr/local/bin/cmake/bin/
退出
- ssource ~/.bashrc
- cmake --version
linux执行cpp文件
运行
- cmake -B build
- cmake --build build
此时的项目结构下会有CMakeLists.txt、build、运行的cpp文件
然后进入build
- cd build
- cmake ..
- make
- ls
执行文件
./Hello
--------------------------------------------------------------------------------
此时的项目结构下会有CMakeLists.txt、build、运行的cpp文件
- build/Hello
删除
rm -rf build
基本语法
cmake命令构成
- cmake
- ctest
- cpack
- cmake-gui
- ccmake
运行.cmake文件,在CMake中如何打印信息
-
cmake -P *.cmake -
cmake_minimum_required(VERSION 3.20) message("hello") # 换行 message([[123 123123]]) # 获取CMAKE中的信息 message(${CMAKE_VERSION})
- 不添加任何关键字:重要信息
- STATUS :非重要消息
- WARNING:CMake 警告, 会继续执行
- AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
- SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤
- FATAL_ERROR:CMake 错误, 终止所有处理过程
变量操作set、list
- CMake中的变量分为两种
- CMake提供
- 自定义
- CMake变量的命名区分大小写,CMake中的变量在存储时都是字符串
- CMake获取变量:${变量名}
- 变量的基础操作是set()与unset(),可以用list或string操作变量
set
cmake_minimum_required(VERSION 3.20)
# 设置缓存变量
set(Var1 "CHINESE牛逼")
message(${Var1})
set("he llo" testvar)
message(${he\ llo})
set(t1 "zhangsan lisi")
message(${t1})
# 设置多个值
set(LISTVALUE a1;a2)
message(${LISTVALUE})
# $PATH
message($ENV{PATH})
set(ENV{CXX} "g++")
message($ENV{CXX})
# unset 取消设置缓存变量
unset(ENV{CXX})
message($ENV{CXX})
list
-
创建列表: 创建一个空的列表或包含初始值的列表。
set(MY_LIST "") # 创建一个空列表 set(MY_LIST "value1" "value2" "value3") # 创建一个包含三个元素的列表 -
访问列表元素: 通过索引访问列表中的元素。列表的索引从0开始。
set(MY_LIST "first" "second" "third") message("${MY_LIST[0]}") # 输出 "first" message("${MY_LIST[1]}") # 输出 "second" -
修改列表元素: 通过索引修改列表中的元素。
set(MY_LIST "first" "second" "third") set(MY_LIST[1] "new_second") # 将索引1处的元素修改为 "new_second" -
列表长度: 获取列表的长度。
set(MY_LIST "a" "b" "c") list(LENGTH MY_LIST LENGTH_OF_LIST) message("Length of list: ${LENGTH_OF_LIST}") # 输出列表的长度 -
列表拼接: 将两个或多个列表拼接成一个。
set(LIST_A "one" "two") set(LIST_B "three" "four") list(APPEND LIST_A LIST_B) # LIST_A 现在变成 "one" "two" "three" "four" -
列表插入: 在列表的指定位置插入一个或多个元素。
set(MY_LIST "first" "third") list(INSERT MY_LIST 1 "second") # 在索引1的位置插入 "second" -
列表移除: 从列表中移除指定位置的元素或匹配特定值的元素。
set(MY_LIST "first" "second" "third") list(REMOVE_AT MY_LIST 1) # 移除索引1处的元素 "second" list(REMOVE_ITEM MY_LIST "third") # 移除列表中所有的 "third" -
列表查找: 查找某个值在列表中的索引。
set(MY_LIST "first" "second" "third") list(FIND MY_LIST "second" INDEX) message("Index of 'second': ${INDEX}") # 输出 "second" 的索引 -
列表反转: 反转整个列表。
set(MY_LIST "first" "second" "third") list(REVERSE MY_LIST) -
列表子序列: 获取列表的一部分作为子序列。
set(MY_LIST "zero" "one" "two" "three" "four") list(SUBLIST MY_LIST 1 2 SUBLIST) # 从索引1开始取两个元素,SUBLIST 变成 "one" "two" -
列表分割: 使用分隔符将列表分割成多个子列表。
set(MY_LIST "a;b;c;d") list(SPLIT MY_LIST ";" SPLIT_LIST) # SPLIT_LIST 变成 "a", "b", "c", "d" -
列表排序: 使用
list(SORT ...)命令对列表中的元素进行排序。默认情况下,如果元素是数字,它们将按照数值顺序排序;如果元素是非数字字符串,它们将按照字典顺序排序。复制set(MY_LIST "banana" "apple" "cherry") list(SORT MY_LIST) # 按照字典顺序排序列表 -
自定义排序: 如果你需要按照特定的规则对列表进行排序,可以使用
list(SORT ...)命令的COMPARE选项,并提供一个自定义的比较函数。set(MY_LIST 5 3 1 4 2) list(SORT MY_LIST COMPARE NATURAL) # 按照自然排序(数值大小)排序列表 -
反向排序: 使用
ORDER关键字和REVERSE选项可以实现反向排序。set(MY_LIST "first" "second" "third") list(SORT MY_LIST ORDER REVERSE) # 将列表反向排序
流程控制
条件流程控制
if(<条件>)
# 如果条件为真,执行的命令
elseif(<条件>)
# 如果第一个条件为假,且第二个条件为真,执行的命令
elseif(<条件>)
# 更多的条件和命令
else()
# 如果以上所有条件都为假,执行的命令
endif()
AND:逻辑与OR:逻辑或NOT:逻辑非EQUAL:相等LESS:小于GREATER:大于LESS_EQUAL:小于等于GREATER_EQUAL:大于等于STREQUAL:字符串相等STRLESS:字符串小于STRGREATER:字符串大于VERSION_LESS:版本号小于VERSI

最低0.47元/天 解锁文章
1507

被折叠的 条评论
为什么被折叠?



