在之前的博客中提到,ESP-IDF采用的是CMake来构建项目,因此需要学习一下CMake,以对ESP32的开发有更好的把握

参考:

Windows下CMake安装教程

从零开始详细介绍CMake

CMake是一种高级编译配置工具,当多人用不同的语言或编译器开发一个项目,最终要输出一个可执行文件或共享库(dll,so等),就可以使用CMake,CMake的所有操作都是通过编译CMakeLists.txt来完成的

CMake的学习其实最好还是在开发中不断的学习,不过掌握一点基础的知识也是可以的,在这里推荐一个github的项目:

cmake-examples

里面有一些案例,可以一步步学习CMake,而且这个项目是英文的,可以锻炼一下自己的英文水平(~ ̄▽ ̄)~

CMake编译helloworld

// helloworld.cpp
#include <iostream>
int int main() {
std::cout << "hello world" << std::endl;
}
# CMakeLists.txt
PROJECT(helloworld)
SET(SRC_LIST helloworld.cpp)
MESSAGE(STATUS "This is BINARY dir" ${helloworld_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${helloworld_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

CMake可以搜索平台环境,然后生成平台上用于build的文件,比如在windows上安装了visual studio,能够生成.sln,.vcxproj文件,在Linux上能够生成Makefile,CMakeLists.txt本质上就是和平台无关的配置文件,里面存有要运行的CMake指令,接下来是使用CMake在Ubuntu上构建helloworld的过程:

关于上面的CMakeLists.txt的语法说明:

  • PROJECT关键字:用于指定工程的名字和支持的语言,默认支持所有语言

    • PROJECT(helloworld):指定了工程名字,且支持所有语言
    • PROJECT(helloworld cxx):指定了工程名字,且支持语言是c++
    • PROJECT(helloworld c cxx):指定了工程名字,且支持语言是c和c++
    • 该指令隐式定义了两个CMake的变量
      • <project_name>_BINARY_DIR,本例中是helloworld_BINARY_DIR
      • <project_name>_SOURCE_DIR,本例中是helloworld_SOURCE_DIR
      • MESSAGE关键字可以直接使用这两个变量,都指向当前的工作目录,在外部编译时有所区别
  • SET关键字:用于显式指定变量

    • SET(SRC_LIST helloworld.cpp):SRC_LIST变量包含了helloworld.cpp
    • 也可以SET(SRC_LIST helloworld.cpp a.cpp b.cpp)
  • MESSAGE关键字:向终端输出用户自定义信息,主要包含三种信息:

    • SEND_ERROR:产生错误,生成过程被跳过
    • STATUS:输出前缀为--的信息
    • FATAL_ERROR:立即终止所有CMake过程
  • ADD_EXECUTABLE关键字:生成可执行文件

    • ADD_EXECUTABLE(hello ${SRC_LIST}):生成可执行文件名是hello,源文件读取变量SRC_LIST中的内容
    • 可以直接写ADD_EXECUTABLE(hello helloworld.cpp)

因此上述例子可简写为:

PROJECT(helloworld)

ADD_EXECUTABLE(hello helloworld.cpp)

上面的工程名和生成的可执行文件名是没有任何关系的

CMake语法的基本规则

  • 变量使用${}方式取值,但是在IF控制语句中直接使用变量名
  • 指令(参数1,参数2,...):参数用括弧括起,参数之间使用空格或分号分开
  • 指令是大小无关的,参数和变量时大小写相关的,推荐使用大写指令

其他注意事项:

  • SET(SRC_LIST helloworld.cpp)可以写为SET(SRC_LIST "helloworld.cpp"):如果源文件名中含有空格,则必须要加双引号
  • ADD_EXECUTABLE(hello helloworld):后缀可以不写,会自动去找.c和.cpp,但是因为可能有两个文件因此最好不要这样写

CMake内部构建和外部构建

上述的helloworld的例子使用的是内部构建,生成的临时文件较多,不方便清理

外部构建会把生成的临时文件放在build目录下,不会对源文件产生影响

步骤:

  • 在当前目录建立一个build目录,可以在任何地方,这一点便于在任何时候都可以从头开始使用CMake进行构建
  • 进入build,运行cmake..(..表示上一级目录,可以写CMakeLists.txt所在的绝对路径,生产的文件都在build目录下,当然这个是建立在你创建的build目录是在当前目录下的)
  • 在build目录下,运行make来构建工程

在外部构建下的两个变量:

  • helloworld_BINARY_DIR:仍为工程路径
  • helloworld_SOURCE_DIR:编译路径,即用户名/cmake/build

最新文章

  1. PowerDesigner连接Oracle并导出表结构
  2. asp.net mvc中ViewData、ViewBag和TempData的详解
  3. bcm cmd
  4. addresslist
  5. validate
  6. 18SpringMvc_在业务控制方法中收集数组参数
  7. MIT牛人解说数学体系(转载)
  8. hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
  9. JavaScript HTML DOM - 改变CSS
  10. windows下Python 3.x图形图像处理库PIL的安装
  11. cocos2dx - 节点管理
  12. 详细图解window环境mongodb下载、安装、配置与使用
  13. 跟我学ASP.NET MVC之六:SportsStrore添加产品目录导航
  14. SQL Server - DISTINCT
  15. MariaDB/MySQL备份和恢复(二):数据导入、导出
  16. Redis具体解释
  17. stylus笔记(三)
  18. path 与classpath针对JAVA来说
  19. 【知了堂学习笔记】java 编写几种常见排序算法
  20. 在Office上怎么用MathType编辑公式

热门文章

  1. 225-基于XCVU440T的多核处理器多输入芯片验证板卡
  2. k8s升级导致hostPath type check failed
  3. composer 换源
  4. pdf导出 预览、直接打印、打印加预览
  5. Java-获取真实用户ip
  6. 记maven打包加入外部jar后tomcat运行失败问题
  7. SpringBoot打成war包,部署到Tomcat服务器
  8. js格式转化
  9. 【笔记】小米路由器AX1800开启ipv6外部访问
  10. OCR接口