Cmake基础教程--第1章:初识cmake
- 何为Cmake
- Cmake的优缺点
- 优点
- 缺点
- Cmake与makefile之间的关系
- C/C++ 如何编译为可执行文件
- 一个最简单的Cmake示例
从本篇文章开始,我会出一系列文章,致力于Cmake工具的学习使用。阅读本文章之前,
作者默认读者会使用基础的命令行工具且具有C++基础。
何为Cmake
首先,Cmake是一个开源的,跨平台的自动化构建工具,它使用一组简单的描述性语言来生成本地构建环境,使用cmake工具,我们可以很好的去管理我们的项目。
对比于其他编程语言的构建工具,Cmake无疑复杂了很多,但这是由于 C++ 古老的编译模型和关注于底层的特性导致的。也正是由于Cmake的出现,才为C++真正提供了可靠的跨平台解决方案
注意
- Cmake并非是包管理工具
- Cmake不仅仅支持C++,Cmake实际支持相当多种语言
对于C++程序员来说,学习Cmake几乎是必经之路。
Cmake的优缺点
优点
- 跨平台支持: Cmake是真正的跨平台工具,支持大多数主流的操作系统(相比之下makefile就不具备良好的跨平台性)
- 与IDE集成度好: Cmake几乎可以用于生成所有主流IDE的项目文件,使得开发者可以使用自己所习惯的开发环境。
- 广泛的社区支持: CMake 拥有庞大的用户群和活跃的社区,这意味着有大量的文档、教程和示例可供参考,遇到问题时也容易找到解决方案。
缺点
- 学习成本高: Cmake是一门语言,初学者需要花相当大的精力来学习
- 更新频繁: Cmake仍旧在发展成长,新版本可能引入不兼容的更改,这要求项目必须持续跟进和适配
Cmake与makefile之间的关系
相信很多人都曾认为过Cmake的功能就是去生成对应的makfile,其实这样的认知是错误的。
Cmake并不一定会生成Makefile,这是由你使用的编译器决定的,只是由于大部分情况是
生成makefile,才给了大家错误的认知。
也由于Cmake构建项目时并不一定会生成makefile,所以不建议cmake搭配make使用。
C/C++ 如何编译为可执行文件
在正式学习Cmake之前,先来了解一下C/C++的基本编译原理。一般来说,可以分为以下四步:
- 预处理: 进行宏替换,展开内联函数,处理条件编译指令(#if之类),以及将头文件内容插入到当前文件中,经过预处理阶段后,源文件会变为一个没有预处理指令的干净的文件。
- 编译 读取预处理后的源代码并将其转换为汇编代码或目标代码,在此期间,译器还会进行各种优化,以提高生成代码的效率。
- 汇编 汇编器将汇编代码转换为机器语言指令的二进制形式,也就是目标代码或对象文件。每个源文件通常会被编译和汇编成单独的对象文件。
- 链接 链接器解析未定义的符号引用,将它们与定义在其他模块或库中的符号匹配。链接器还会重定位代码和数据,使其在内存中处于正确的地址,同时合并数据段和代码段,生成最终的可执行文件。
一个最简单的Cmake示例
我们在项目目录中编写一个名为main.cpp的源文件,接下来演示如何使用Cmake来构建这个
简单项目。
- 编写 CMakeLists.txt 文件
在工程目录下编写一个名为CMakeLists.txt的文件,这里注意大小写不要拼错。在CMakeLists.txt中编写以下代码:
cmake_minimum_required(VERSION 3.20) #指定最小版本
project(HELLO) #指定项目名
add_executable(test main.cpp) #指定由源文件main.cpp生成可执行文件test
这里注意#为cmake语法中的注释,每行代码的功能已经在代码中指出,使用该cmake可以使用main.cpp来编译出可执行文件test。其中project指定的项目名与生成的可执行文件名称并无关系。
- 使用cmake生成makefile或其他文件
在工程目录使用以下命令来生成makefile或其他的文件(注意这里的环境会生成makefile,但这并不是绝对的,例如在msvc下就不会生成makefile而是其他的文件,后文均以makfile举例)
cmake -B [目录名称]
如下:
该命令会指定一个文件夹的名称,然后生成这个目录,会将makefile相关的文件放入build目录中,注意,在大部分情况下,我们都不应该修改该目录下的文件内容。
3. 生成项目
使用如下命令来生成项目:
cmake --build [目录名称]
如下:
命令的目录应当与上一步生成的目录一致,执行完之后,会在该目录下生成对应的可执行文件。注意,在本例中,你直接在build的目录下使用make命令也能编译得到正确的可执行文件,但这不是我们赞成的行为。
至此,你就完成了一个最简单的Cmake的工程构建。