目录
一、介绍
1、make工程管理器
2、Makefile
二、Makefile语法规则
1、Makefile语法格式
2、Makefile中特殊处理与伪目标
3、变量、规则与函数
(1)自定义变量使用示例
(2)自动变量使用示例
一、介绍
1、make工程管理器
定义:
make是一个命令工具,它根据文件的时间戳自动发现更新过的文件,从而减少编译的工作量。make工程管理器因此得名“自动编译管理器”
工作原理:
make命令会在当前目录下寻找名为“Makefile”或“makefile”的文件。如果找到,它会查找文件中的第一个目标文件(target),并将其作为最终的目标文件。如果目标文件不存在,或者目标文件所依赖的文件的修改时间比目标文件新,那么make会执行后面所定义的命令来生成目标文件。make会递归地检查依赖关系,直到所有目标都更新完成。
2、Makefile
定义:
Makefile是用于管理项目构建过程的文件,它包含了构建项目的规则。make命令会读取Makefile文件中的内容来执行大量的编译工作。
基本语法:
目标(Target):需要生成的文件,例如可执行文件。
依赖(Dependencies):生成目标所依赖的文件或目标。
命令(Commands):构建目标时需要执行的命令,这些命令必须以Tab键开头。
总结:
make 和Makefile的作用
第一个:减少编译工作量,节约编译时间
第二个:简化编译操作,编译命令-->放到Makefile
二、Makefile语法规则
1、Makefile语法格式
基本格式:(要求)
第一行:Target(目标):dependency_files(依赖)
类似:main:main.o ---例如:a.c (预处理 预编译 汇编 链接)a.out
第二行:TAB键(必须) command---->解释:必须以TAB键开头,command为编译命令
类似:按下Tab键 gcc main.o -o main
示例:编写一个基本的Makefile文件
代码:
test:a.o
gcc a.o -o test
a.o:a.c
gcc -c a.c -o a.o
clean:
rm test
说明:
①目标(target)和依赖(dependency)关系:
test: a.o:这一行定义了一个名为test的目标,它依赖于文件a.o。这意味着,当a.o文件被更新(或者不存在)时,make工具会执行后面指定的命令来生成或更新test。
a.o: a.c:这定义了一个名为a.o的目标,它依赖于文件a.c。如果a.c文件被修改,make会重新编译a.c来生成或更新a.o。
②命令(command):
gcc a.o -o test:这是生成test目标的命令。它告诉gcc将a.o链接成一个可执行文件,文件名为test。
gcc -c a.c -o a.o:这是生成a.o目标的命令。-c选项告诉gcc只编译和汇编a.c,不进行链接,输出为对象文件a.o。
③伪目标(phony target):
clean:这是一个伪目标,它不对应任何文件名。通常用于执行清理工作,比如删除编译生成的文件。
rm test:这是clean目标对应的命令,用于删除可执行文件test。
2、Makefile中特殊处理与伪目标
伪目标并不是文件,而是一种命令名称,可以用于执行一些常见的操作,如清理构建文件。它们通常定义为.PHONY: clean,然后后面跟上具体的清理命令,如:
clean:
rm -f *.o main
注意:在运行make的必须指定才能运行
示例:
现象:
代码:
test:a.o
gcc a.o -o test
a.o:a.c
gcc -c a.c -o a.o
.PHONY:clean a
clean:
rm test a.o
a:
cp a.c aa.c
3、变量、规则与函数
(1)自定义变量使用示例
变量的定义格式为VARIABLE_NAME = value,在引用变量时使用$(VARIABLE_NAME)。
变量名区分大小写。注意:#表示注释行
赋值变量的4种方法:
①变量名=变量的值
例子: A=3
②变量名:=变量值 解释:覆盖之前的值,通常采用这种方式
例子: A=123
③变量名 += 变量值
例子: B=123
B+=4,此时,B的值为1234
④变量名 ?= 变量值 如果这个变量没有赋值就给它赋值
示例:操作赋值变量
现象:
代码:
A=123
A=1234
A+=5
B?=666
test:a.o
gcc a.o -o test
a.o:a.c
gcc -c a.c -o a.o
.PHONY:clean a
clean:
@echo -e $(A)
@echo -e $(B)
a:
ls
(2)自动变量使用示例
自动变量:系统内部使用的时候,自动用特定的值进行替换。
变量说明:
$@ 当前规则下的目标文件
$< 当前规则下的第一个依赖文件
$^ 当前规则下的所有依赖文件,以逗号分隔
gcc命令
-c 编译 不链接
-o 输出指定的文件 test main main.o
@:作用是取消命令执行的时候回显
示例1:自定义变量替换变量,编译生成一个可执行程序
现象:
代码:
E=123
E=1234
E+=5
G?=666
SCR?=a.o b.o c.o
A=a.o
B=b.o
C=c.o
A_C=a.c
B_C=b.c
C_C=c.c
T=test
CC=gcc
P=-c
M=-o
$(T):$(SCR)
$(CC) $^ $(M) $@
$(A):$(A_C)
$(CC) $(P) $< $(M) $@
$(B):$(B_C)
$(CC) $(P) $< $(M) $@
$(C):$(C_C)
$(CC) $(P) $< $(M) $@
.PHONY:clean a b
clean:
rm *.o test
a:
@echo -e $(E)
@echo -e $(G)
b:
ls
示例2:同时编译生成多个可执行程序
现象:
代码:
all:main1 main2
main1:main1.c
gcc main1.c -o main1
main2:main2.c
gcc main2.c -o main2
总结:1:Makefile工程管理工具---管理多个源代码的---一次编译多个源文件。
2:Makefile可以生成不同的可执行程序。