最近在学习各大物联网平台的SDK包,发现其工程都使用了一种叫cmake的工具在管理代码。于是花了一天时间简单学习了解了cmake工具,其目的是让自己能读懂使用该工具管理的代码,并能简单使用该工具管理我自己的工程代码。CMAKE与Makefile类似,是一种代码编译工具,cmake解决了Makefile跨平台编译难的问题,其语法规则比较简单且易于上手,下面是作者初学cmake的笔记

一、CMAKE下载

cmake下载路径可以选择下面两个,具体的软件版本请根据不同环境下载 作者的笔记是在linux64位环境

[GitHub]:https://github.com/Kitware/CMake/releases

[官网]:https://cmake.org/download/

下载后对压缩文件解压

  • 1
    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的最小版本

  • 1 cmake_minimum_required
    (VERSION 2.8)
  • 这行命令是可选的,我们可以不写这句话,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。

    2、设置项目名称

  • 1 project
    (demo)
  • 这行命令也是可选项,但最好在语法中都加上,它会引入两个变量demo_BINARY_DIR和demo_SOURCE_DIR,并且cmake也会定义两个等价的变量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。

    3、指定编译包含的源文件

    3.1 自动搜索目录下的.c文件

  • 1 aux_source_director
    (./ DIR_SRC)
  • 3.2 设置变量

  • 1 set
    (DIR_SRC demo.c)
  • 2 set
    (DIR_SRC ${DIR_SRC} main.c) //set追加设置变量的值
  • 变量后可接多个源文件

    3.3 指定包含的源文件

  • 1 add_library
    (demo demo.c main.c)
  • 4、设置包含的目录

  • 1 include_directories
    (${PROJECT_SOURCE_DIR}/src)
  • 目录下的源文件会分别被cmake执行

    5、设置编译类型

  • 1 add_executable
    (demo ${DIR_SRC})
  • 2 add_library
    (demo ${DIR_SRC})
  • 前者生成可执行文件 后者生成静态库

    6、设置工程需要连接的库文件

  • 1 target_link_libraries
    (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目录

    编译过程中产生的中间文件将放在该目录下面

  • 1
    mkdir build
  • 3.2 编译源代码

    进入build目录并执行下面两条指令

    五、Linux下gdb简介

    1、cmake下的gdb

    cmake把生成的可执行文件分成两种模式,realease与debug,默认是realease模式,调试模式通过以下指令进入

  • 1
    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工具学习的更多相关文章

    1. Git版本控制工具学习

      Git代码管理工具学习 分布式管理工具:git 相比较svn它更加的方便,基本上我们的操作都是在本地进行的. Git文件的三种状态:已提交,已修改,以暂存. 已提交:表示文件已经被保存到本地数据库. ...

    2. sql server 内置ETL工具学习(一) BCP篇

      sql server 内置ETL工具学习 常用的导入方式:bcp, BULK INSERT,OPENROWSET和 SSIS. BCP BCP全称BULK COPY PROGRAM 有以下特点: 命令 ...

    3. centos 6.5下cmake工具的安装与配置

      一.cmake是什么? CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C+ ...

    4. linux 工具学习网站

      推荐一个很不错的linux工具学习网站; 对于一个开发人员来说,我觉得掌握这些工具对于基于linux的应用开发来说事半功倍. http://linuxtools-rst.readthedocs.io/ ...

    5. [原创]Jmeter工具学习思维导图

      [原创]Jmeter工具学习思维导图

    6. [转] 用协议分析工具学习TCP/IP

      一.前言 目前,网络的速度发展非常快,学习网络的人也越来越多,稍有网络常识的人都知道TCP/IP协议是网络的基础,是Internet的语言,可以说没有TCP/IP协议就没有互联网的今天.目前号称搞网的 ...

    7. 第八模块:算法&设计模式、企业应用 第2章 企业应用工具学习

      第八模块:算法&设计模式.企业应用 第2章 企业应用工具学习

    8. webpack前端构建工具学习总结(一)之webpack安装、创建项目

      npm是随nodeJs安装包一起安装的包管理工具,能解决NodeJS代码部署上的很多问题: 常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器 ...

    9. webpack前端构建工具学习总结(二)之loader的使用

      Webpack 本身只能处理 JavaScript 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换. Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接受源文件作为 ...

    随机推荐

    1. Docker在centos上的安装与常用命令大全

      docker的安装与加速器配置 安装docker:yum install docker (默认安装路径/var/lib/docker) 启动docker服务:systemctl start docke ...

    2. php的 mysqlnd驱动

      这篇文章写的好 http://blog.linuxeye.com/395.html 传统编译php的时候需要指定mysql 的参数 --with-mysql=/usr/local/mysql \ -- ...

    3. 剑指Offer02之替换空格

      剑指Offer02之替换空格 题目描述 实现一个方法,将输入的字符串中的空格替换成%20. 例子如下 hello world --> hello%20world 代码实现 //方法一 采用Jav ...

    4. js得到文件后缀

      js得到文件后缀  http://www.cnblogs.com/lan0725/archive/2010/05/25/1873745.html function getFileExt(str) {  ...

    5. VxLAN协议详解

      版权声明:本文为Heriam博主原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://jiang-hao.com/articles/2020/n ...

    6. 搭建Istio基础环境

      需求 搭建istio基础环境(基于1.5.1版本) 安装步骤 在安装 Istio 之前,需要一个运行着 Kubernetes 的环境,安装步骤可以参考前面的文章 下载istio,然后解压,然后将 is ...

    7. Asp.Net Core入门之配置文件

      ASP.NET Core配置框架已内建支持 JSON.XML 和 INI 配置文件,内存配置(直接通过代码设置值),环境变量配置等方式配置参数. 本文主要和大家讲一下我们在项目中常用的以配置文件的方式 ...

    8. 【数字图像处理】OpenCV中cv2.imread()与PIL中Image.open()的差别

      cv2.imread()与PIL中Image.open()两个函数都是用来读取图像,但是在使用过程存在一些差别. 1. 首先,从导入库方面看: # opencv-python import cv2 # ...

    9. BUUCTF Crypto_WP(2)

      BUUCTF Crypto WP 几道密码学wp [GXYCTF2019]CheckIn 知识点:Base64,rot47 下载文件后,发现一个txt文件,打开发现一串base64,界面之后出现一串乱 ...

    10. sql 索引常见失效的几种情况

      1. 对于联合索引,没有遵循左前缀原则 2. 索引的字段区分度不大,可能引起索引近乎全表扫描 3. 对于join操作,索引字段的编码不一致,导致使用索引失效 4.对于hash索引,范围查询失效,has ...