CMAKE工具学习
最近在学习各大物联网平台的SDK包,发现其工程都使用了一种叫cmake的工具在管理代码。于是花了一天时间简单学习了解了cmake工具,其目的是让自己能读懂使用该工具管理的代码,并能简单使用该工具管理我自己的工程代码。CMAKE与Makefile类似,是一种代码编译工具,cmake解决了Makefile跨平台编译难的问题,其语法规则比较简单且易于上手,下面是作者初学cmake的笔记
一、CMAKE下载
cmake下载路径可以选择下面两个,具体的软件版本请根据不同环境下载 作者的笔记是在linux64位环境
[GitHub]:https://github.com/Kitware/CMake/releases
[官网]:https://cmake.org/download/
下载后对压缩文件解压
|
tar -zxf cmake-3.16.6 |
二、CMAKE安装与卸载
1、./configure
初次配置会提示未安装openssl,根据提示在cmakelist.txt中添加 set(CMAKE_USE_OPENSSL OFF)禁用openssl或者在当前环境下安装openssl 作者采用了禁用openssl方案

出现下面提示表示cmake配置成功 可以使用make编译源代码

2、make 编译安装包

3、sudo make install
未用管理员身份安装会提示以下错误

4、cmake --version 显示出版本号表示安装成功

5、cat install_manifest.txt | sudo xargs rm 卸载并删除安装的文件

三、CMAKE语法规则
1、指定cmake的最小版本
|
(VERSION 2.8) |
这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。
2、设置项目名称
|
(demo) |
这行命令也是可选项,但最好在语法中都加上,它会引入两个变量demo_BINARY_DIR和demo_SOURCE_DIR,并且cmake也会定义两个等价的变量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。
3、指定编译包含的源文件
3.1 自动搜索目录下的.c文件
|
(./ DIR_SRC) |
3.2 设置变量
|
(DIR_SRC demo.c) (DIR_SRC ${DIR_SRC} main.c) //set追加设置变量的值 |
变量后可接多个源文件
3.3 指定包含的源文件
|
(demo demo.c main.c) |
4、设置包含的目录
|
(${PROJECT_SOURCE_DIR}/src) |
目录下的源文件会分别被cmake执行
5、设置编译类型
|
(demo ${DIR_SRC}) (demo ${DIR_SRC}) |
前者生成可执行文件 后者生成静态库
6、设置工程需要连接的库文件
|
(demo fastsort) |
四、项目示例
1、一级目录下CMakeLists.txt代码
cmake_minimum_required(VERSION 2.8)
project(demo)
include_directories(${PROJECT_SOURCE_DIR}/src)
add_subdirectory(src)
set(DIR_SRC demo.c)
add_executable(demo ${DIR_SRC})
target_link_libraries(demo fastsort)
2、二级目录(src)下CMakeLists.txt代码
aux_source_directory(. DIR_SRC)
add_library(fastsort ${DIR_SRC})
3、编译过程
3.1 在一级目录下新建build目录
编译过程中产生的中间文件将放在该目录下面
|
mkdir build |
3.2 编译源代码
进入build目录并执行下面两条指令

五、Linux下gdb简介
1、cmake下的gdb
cmake把生成的可执行文件分成两种模式,realease与debug,默认是realease模式,调试模式通过以下指令进入
|
cmake -DCMAKE_BUILD_TYPE=Debug .. |
或者在一级目录下的CMakeLists.txt文件中加入set(CMAKE_BUILD_TYPE Debug CACHE STRING "set build type to debug")or set(CMAKE_BUILD_TYPE "Debug")
2、gdb常用语法
2.1 gdb file
file为可执行文件,进入gdb环境。
2.2 (gdb)list(l) n | list 函数名
查看源代码,n为需要显示代码行数,每次显示10行。
2.3 (gdb)break(b) n | break 函数名
设置断点,n为源代码的行号。
2.4 (gdb)delete n | delete 函数名 | delete breakpoints
删除断点,n为源代码的行号,最后一个为删除所有断点。
2.5 (gdb)info breakpoints(b)
显示当前程序的所有断点。
2.6 (gdb)start
开始执行程序并停在main函数开始处。
2.7 (gdb)run(r)
开始运行程序并停在断点处。
2.8 (gdb)next(n)
执行下一行语句,不进入函数。
2.9 (gdb)step(s)
执行下一行语句,遇到函数时进入函数。
2.10 (gdb)continue(c)
继续执行程序,直到遇到断点。
2.11 (gdb)until | until n
运行到退出循环体。
2.12 (gdb)finish
运行到函数返回 并打印函数返回时的堆栈地址和返回值及参数等信息。
2.13 (gdb)print 变量名
打印变量的值。
2.14 (gdb)quit
退出gdb。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
清风 | 文 【原创】
如果本篇博客有任何错误,请批评指教,不胜感激 !
参考文档:
[cmake语法规则]:https://blog.csdn.net/afei__/article/details/81201039?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
[debug]:https://www.cnblogs.com/sunshine1218/p/12520988.html or https://www.cnblogs.com/jingzhishen/p/3783499.html
CMAKE工具学习的更多相关文章
- Git版本控制工具学习
Git代码管理工具学习 分布式管理工具:git 相比较svn它更加的方便,基本上我们的操作都是在本地进行的. Git文件的三种状态:已提交,已修改,以暂存. 已提交:表示文件已经被保存到本地数据库. ...
- sql server 内置ETL工具学习(一) BCP篇
sql server 内置ETL工具学习 常用的导入方式:bcp, BULK INSERT,OPENROWSET和 SSIS. BCP BCP全称BULK COPY PROGRAM 有以下特点: 命令 ...
- centos 6.5下cmake工具的安装与配置
一.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...
- linux 工具学习网站
推荐一个很不错的linux工具学习网站; 对于一个开发人员来说,我觉得掌握这些工具对于基于linux的应用开发来说事半功倍. http://linuxtools-rst.readthedocs.io/ ...
- [原创]Jmeter工具学习思维导图
[原创]Jmeter工具学习思维导图
- [转] 用协议分析工具学习TCP/IP
一.前言 目前,网络的速度发展非常快,学习网络的人也越来越多,稍有网络常识的人都知道TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天.目前号称搞网的 ...
- 第八模块:算法&设计模式、企业应用 第2章 企业应用工具学习
第八模块:算法&设计模式.企业应用 第2章 企业应用工具学习
- webpack前端构建工具学习总结(一)之webpack安装、创建项目
npm是随nodeJs安装包一起安装的包管理工具,能解决NodeJS代码部署上的很多问题: 常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器 ...
- webpack前端构建工具学习总结(二)之loader的使用
Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换. Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为 ...
随机推荐
- 基于VUE实现的h5网页Web出库单入库单打印设计
经过将近一个月的研发,初步实现了打印单据的自定义设计,样子还有点丑陋,但是功能基本都实现了,实现了以下功能: 1.表头表尾支持动态添加行.添加列.合并单元格(可多行多列合并). 2.表头表尾分别布局, ...
- 谈谈Java常用类库中的设计模式 - Part Ⅰ
背景 最近一口气看完了Joshua Bloch大神的Effective Java(下文简称EJ).书中以tips的形式罗列了Java开发中的最佳实践,每个tip都将其意图和要点压缩在了标题里,这种做法 ...
- python之Python内置函数一览表
Python 解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块. 如果你熟悉 Shell 编程,了解什么是 Shell 内置命令,那么你也很容易理解什么是 Python 内置函数 ...
- AI技术原理|机器学习算法
摘要 机器学习算法分类:监督学习.半监督学习.无监督学习.强化学习 基本的机器学习算法:线性回归.支持向量机(SVM).最近邻居(KNN).逻辑回归.决策树.k平均.随机森林.朴素贝叶斯.降维.梯度增 ...
- Appium自动化(13) - 详解 Keyboard 类里的方法和源码分析
如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 Keyboard 类在 a ...
- DPDK Mempool 库原理(学习笔记)
1 前置知识点学习(了解) 从CPU到实际的存储节点,依据层级划分:Channel > DIMM > Rank > Chip > Bank > Row /Column 1 ...
- 取经四人组SQL
一.表结构与数据 1.create table user1 (id int not null,user_name varchar(20) not null,over varchar(20) defau ...
- BitArray虽好,但请不要滥用,又一次线上内存暴增排查
一:背景 1. 讲故事 前天写了一篇大内存排查在园子里挺火,这是做自媒体最开心的事拉,干脆再来一篇满足大家胃口,上个月我写了一篇博客提到过使用bitmap对原来的List<CustomerID& ...
- 在DAO的查询操作里,数据库查询到记录,sql语句也成功执行,但是返回的对象是null
在这里 如果改成User user=null; 后面 对user对象的赋值是会失败的. 原因: 要赋值的话,一定要有对象,要new一下给对象分配空间然后再给对象赋值.
- Element-UI自定义主题
Element-UI自定义主题 1.介绍:我们可以自定义样式去覆盖element-ui的默认样式 // 在项目目录中新建 element-variables.scss 文件 // 上面为修改的变量 $ ...