一、概念
- gcc是一种编译器。将源代码转为可执行文件。
当你的程序只有一个源文件时,直接就可以用gcc命令编译它。但当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大,所以出现了make工具。
- make是一个批处理工具。在整个项目中管理编译过程。其依据是makefile文件。
- makefile是一个文本文件,用于指挥make。其中包含一系列规则和命令。make 工具通过读取 makefile 中的规则来确定需要重新编译哪些文件,以及执行哪些命令来完成编译过程。
makefile在一些简单的工程完全可以用人工手写,但是当工程非常大的时候,手写makefile也是非常麻烦的,并且如果换了个平台makefile又要重新修改。这时候就出现了Cmake工具。
- cmake是一个跨平台构建工具。cmake可以更加简单的生成makefile文件给make用。
- cmakelist是一个文本文件,用于指挥cmake。
编译(compile):代码变成可执行文件
构建(build):先编译这个,还是先编译那个(即编译的顺序安排)
Make是最常用的构建工具。也就是将编译的顺序写在一个叫Makefile的文件中。Make命令依赖这个文件进行构建。
构建规则都写在Makefile文件里面,要学会如何Make命令,就必须学会如何编写Makefile文件。
二、Makefile
当我们修改某个文件的时候他只会编译其中修改了的文件,而不会编译其他文件,大大缩短了编译时间。
1)基本语法
- 目标:一般是指要编译的目标,也可以是一个动作。
- 依赖:指执行当前目标所要依赖的选项,包括其它目标,某个具体文件或库等。
注意:一个目标可以有多个依赖,但也可以没有。
- 命令:该目标下要执行的具体命令,可以没有,也可以有多条。但要注意,如果有多条,则每条命令写一行。
注意:命令之前别忘了加TAB符。
2)变量
1.系统常量(可用make -p 查看)
AS | 汇编程序的名称,默认为 as |
CC | C编译期名称,默认为 cc |
CPP | C预编译期名称,默认为 cc -E |
CXX | C++编译器名称,默认为 g++ |
RM | 文件删除程序别名,默认为 rm -f |
2.自定义变量
定义:变量名=变量值
使用:$(变量名), ${变量值}
3.系统变量
$* | 不包括扩展名的目标文件名称 |
$+ | 所有的依赖文件,以空格分隔 |
$< | 表示规则中的第一个条件 |
$? | 所有时间戳比目标文件晚的依赖文件,以空格分隔 |
$@ | 目标文件的完整名称 |
$^ | 所有不重复的依赖文件,以空格分隔 |
$% | 如果目标是归档成员,则该变量表示目标的归档成员名称 |
三、CMakeList
- makefile是在Linux编译c或者c++代码的时候的一种脚本文件,但是每一个功能都要写一个makefile文件,这样如果这个工程很大,而且相关性比较强的话,makefile的书写就会变得相对繁琐,看起来就会特别麻烦
- cmake是为了生成makefile 脚本文件,这样我们就不需要再去写makefile了,只需要写简单的CMakeLists.txt即可
- cmake之后就会产生我们想要的makefile文件,然后再直接make就可以编译出我们需要的结果了
# 表示cmake的最低版本
cmake_minimum_required (VERSION 2.6)
# 表示目前编译的项目
project (day07)
# 表示当前编译使用c++14版本来编译程序
set(CMAKE_CXX_STANDARD 14)
# 表示项目的执行程序, 括号中的day07 表示最终生成的执行程序名称, 后面的表示程序的源码文件
add_executable(day07 main.cpp stu.cpp)
1)编译产生
- 直接在当前源码目录执行cmake命令 cmake ./,但是这样会在当前目录下产生很多临时文件和目录
- 在当前目录新建一个build目录,然后我门进入到build目录,执行命令cmake ../,这样产生的所有临时文件都会生成在build目录下,而不影响源码目录的代码
我们这里采用第二种方式:外部构建
可以看到生成了很多文件,主要的是生成makefile文件
然后执行make就可以编译,并生成可执行文件了
最后运行可执行文件