1.什么是make
代码变成可执行文件, 叫做编译(compile),先编译这个, 还是先编译那个(即编译的安排), 叫做构建(build)。
make是最常用的构建工具,主要用于C/C++的项目. gcc与g++是常用的编译工具
2.Makefile
make默认会根据Makefile文件中的指令来构建,也可以在参数中指定makefile
指定makefile的参数: -f FILE, --file=FILE, --makefile=FILE
3.make的安装
(1)CentOS默认已经带有make
(2)Windows可以安装msys2
4.Makefile的编写
(1)Makefile文件由一系列规则(rules)构成。每条规则的形式如下:
<target> : <prerequisites>
[tab] <commands>
上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。
"目标"是必需的,不可省略;"前置条件"和"命令"都是可选的,但是两者之中必须至少存在一个。
(2)target - 目标
一般一个目标为一个文件,如 hello.o
除了文件名,目标还可以是某个操作的名字,这称为"伪目标"(phony target)
如果Make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标
(3)前置条件(prerequisites)
前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建
(4)命令(commands)
命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。
每行命令之前必须有一个tab键。如果想用其他键,可以用内置变量.RECIPEPREFIX声明.
注意: 每行命令在一个单独的shell中执行。这些Shell之间没有继承关系
5.Makefile的语法
(1)# 在Makefile中表示注释
(2)在命令的前面加上@,就可以关闭回显
(3)Makefile 允许使用等号自定义变量, 可以在rules外定义,如:
txt = Hello World
调用时,变量需要放在 $( ) 之中
(4)内置变量
CXX: C++编译器,默认为g++
(5)自动变量
$@指代当前目标
$< 指代第一个前置条件
6.Makefile中的其他细节
(1)makefile中的加号+,减号-和at号@的含义
@ 使命令在被执行前不被回显
- 使任何命令行的任何非零退出状态都被忽略。
7.示例的Makefile
(1)hello.cpp
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
(2)Makefile for hello.cpp
all:hello.exe hello2.exe # makefile默认仅执行第1个rule,因此将第1个rule设置为所有的输出
hello.o : hello.cpp # hello.cpp是hello.o的前提
@echo building $@, the prerequisites is $<
g++ -c hello.cpp -o hello.o
hello.exe : hello.o # hello.o是hello.exe的前提
@echo building $@, the prerequisites is $<
g++ hello.o -o hello.exe
hello2.exe : hello.cpp # 从hello.cpp直接编译出exe
@echo building $@, the prerequisites is $<
g++ hello.cpp -o hello2.exe
clean :
-rm hello.o
-rm hello.exe
-rm hello2.exe
install :
-@test -d bin || mkdir bin
cp -frv hello.exe bin/hello.exe
cp -frv hello2.exe bin/hello2.exe
.PHONY: clean all install
# 伪目标,声明clean是"伪目标"之后,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令
6.参考
(1)阮一峰的Make命令教程: Make 命令教程 - 阮一峰的网络日志
(2)make官方文档: GNU make
(3)makefile中的加号+,减号-和at号@的含义: https://www.cnblogs.com/leaven/p/4337628.html