【CMake保姆级教程】CMake的使用

简介: 【CMake保姆级教程】CMake的使用

前言


在上节课我们已经讲了CMake的安装和简单使用,本节课我们来讲解CMake的命令和他的含义


CMake的使用


CMake支持大写、小写、混合大小写的命令。如果在编写CMakeLists.txt文件时使用的工具有对应的命令提示,那么大小写随缘即可,不要太过在意。


注释


注释行

注释行:

其实就是注释一行的内容和我们C/C++的//一样的功能。

CMake 使用 # 进行行注释,可以放在任何位置

# 这是一个 CMakeLists.txt 文件


注释块

注释块:

其实就是注释一行或者多行的内容,和我们C/C++的/**/一样的功能。

CMake 使用 #[[ ]] 形式进行块注释。

#[[ 这是一个 CMakeLists.txt 文件。
这是一个 CMakeLists.txt 文件
这是一个 CMakeLists.txt 文件]]


CMake操作


1、设置CMake的最低版本

cmake_minimum_required(VERSION 3.0.0)#设置cmake最低版本为3.0.0.0


2、定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。


定义工程名称语法:

# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
       [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
       [DESCRIPTION <project-description-string>]
       [HOMEPAGE_URL <url-string>]
       [LANGUAGES <language-name>...])


常见的使用如下:

project(test)


3、定义工程会生成一个可执行程序
使用add_executable定义工程会生成一个可执行程序。

#样式1
add_executable(生成的可执行文件名称 1.c 2.c n.c)#源文件中间使用空格隔开
#样式2
add_executable(生成的可执行文件名称 1.c;2.c;n.c)#源文件中间使用 ";"隔开


共处一室


cmake测试文件:

cmake_minimum_required(VERSION 3.0.0)
project(test)
add_executable(app main.c func.c)


当源文件像下面这样,在同一个文件夹下,并且生成的cmake文件也在一个文件夹这就叫共处一室。

未执行cmake前:

├── CMakeLists.txt
├── func.c
└── main.c


使用cmake .make执行后

就会多出很多文件↓

├── app#new file
├── CMakeCache.txt#new file
├── CMakeFiles#new file
│   ├── 3.22.1
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── a.out
│   │   │   ├── CMakeCCompilerId.c
│   │   │   └── tmp
│   │   └── CompilerIdCXX
│   │       ├── a.out
│   │       ├── CMakeCXXCompilerId.cpp
│   │       └── tmp
│   ├── app.dir#new file
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── compiler_depend.make
│   │   ├── compiler_depend.ts
│   │   ├── DependInfo.cmake
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── func.c.o
│   │   ├── func.c.o.d
│   │   ├── link.txt
│   │   ├── main.c.o
│   │   ├── main.c.o.d
│   │   └── progress.make
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake#new file
├── CMakeLists.txt
├── func.c
├── main.c
└── Makefile#new file


最终可执行程序app就被编译出来了(这个名字是在CMakeLists.txt中指定的)。


VIP 包房


通过上面的例子可以看出,如果在CMakeLists.txt文件所在目录执行了cmake命令之后就会生成一些目录和文件(包括 makefile 文件),如果再基于makefile文件执行make命令,程序在编译过程中还会生成一些中间文件和一个可执行文件,这样会导致整个项目目录看起来很混乱,不太容易管理和维护,此时我们就可以把生成的这些与项目源码无关的文件统一放到一个对应的目录里边,比如将这个目录命名为build:

├── build
├── CMakeLists.txt
├── func.c
└── main.c


使用cd build/命令打开他。

a2a152c4c7454608bfdcf8be824d3f3c.png


使用cmake ..命令执行cmake因为CMakeLists.txt在上级目录,所以使用cmake ..

0d9287734dc44905b93c15de7bf7b864.png


像这样就是好了。

直接在本目录执行make命令生成可执行文件

9dad395c257047048c5905019d618473.png

使用tree命令,得到下面的东西:

├── app
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.22.1
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── a.out
│   │   │   ├── CMakeCCompilerId.c
│   │   │   └── tmp
│   │   └── CompilerIdCXX
│   │       ├── a.out
│   │       ├── CMakeCXXCompilerId.cpp
│   │       └── tmp
│   ├── app.dir
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── compiler_depend.internal
│   │   ├── compiler_depend.make
│   │   ├── compiler_depend.ts
│   │   ├── DependInfo.cmake
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── func.c.o
│   │   ├── func.c.o.d
│   │   ├── link.txt
│   │   ├── main.c.o
│   │   ├── main.c.o.d
│   │   └── progress.make
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
└── Makefile


我们发现app我们指定的可执行文件就在这里。

我们使用./app去执行他

bec536c3d0b044fd9a0cc3e781955222.png

这时就执行出我们的东西了

相关文章
|
存储 缓存 算法
【CMake 基础教程 】深入理解CMake变量:类型、原理及最佳实践
【CMake 基础教程 】深入理解CMake变量:类型、原理及最佳实践
448 0
|
中间件 测试技术 持续交付
软件测试中的自动化测试实践指南
【10月更文挑战第4天】 本文探讨了软件测试中自动化测试的重要性,并详细介绍了如何有效实施自动化测试。从选择合适的工具到设计测试用例,再到实际执行与持续集成,我们将一步步引导读者了解自动化测试的全过程。通过具体案例分析,我们展示了自动化测试在提高测试效率、保障软件质量方面的显著优势。无论是初学者还是资深测试工程师,都能从中获得实用的指导和启示。
376 1
|
缓存 Unix 程序员
CMake 教程1
CMake 教程
300 1
|
IDE Ubuntu Linux
【CMake保姆级教程】CMake图文安装教程
【CMake保姆级教程】CMake图文安装教程
1172 0
|
存储 缓存 安全
Qt QLinkedList 详解:从底层原理到高级用法
Qt QLinkedList 详解:从底层原理到高级用法
540 0
|
前端开发 JavaScript 开发者
React生命周期方法完全指南:深入理解并高效应用每个阶段的钩子——从初始化到卸载的全方位解析
【8月更文挑战第31天】本文详细介绍了React组件生命周期方法,包括初始化、挂载、更新和卸载四个阶段的关键钩子。通过探讨每个阶段的方法,如`componentDidMount`和`componentWillUnmount`,帮助开发者在正确时机执行所需操作,提升应用性能。文章还提供了最佳实践,指导如何避免常见错误并充分利用最新钩子。
407 0
|
存储
CMake中遍历元素的技巧:foreach命令详解
CMake中遍历元素的技巧:foreach命令详解
899 1
sourcetree设置忽略文件
sourcetree设置忽略文件
835 0
|
传感器 芯片
【STM32基础 CubeMX】从0带你点灯
【STM32基础 CubeMX】从0带你点灯
733 0
【STM32基础 CubeMX】从0带你点灯
|
机器学习/深度学习 测试技术 开发者
最新PyCharm下载安装以及Python环境搭建教程(含Python入门教程)
最新PyCharm下载安装以及Python环境搭建教程(含Python入门教程)
2652 1