本文目录
一、Makefile的引入
当一个项目工程中有很多个.c文件时。如果经常使用gcc来一个一个进行编译再链接会很繁琐,为了方便使用,引入Makefile文件。这样可以使所有的.c文件一起进行编译链接,并生成可执行文件。
二、Makefile相关知识点
1. 定义变量
使用:变量名:= 变量存储的信息
2. 变量引用符 $
$
有特殊的含义(表示变量或者函数的引用),如果我们的规则如果需要使用没有特殊含义的该字符$
,需要书写两个连续的$$
。如下:
Name_A:=10
Name_B:=$(Name_A) #这里Name_B的值也为10。
SRC_DIR:=./src/
3. wildcard函数
以使用$(wildcard $(SRC_DIR)*.c)
来获取工作目录SRC_DIR下的所有的.c 文件列表。
4. patsubst函数
格式替换功能。$(patsubst %.c, %.o , $(wildcard $(SRC_DIR)*.c))
,首先使用wildcard
函数获取工作目录SRC_DIR下的.c文件列表,之后将列表中所有文件名的后缀.c替换为.o目标文件。这样我们就可以得到.o文件列表(只是名字列表,而不是实质的.o文件)。
5. 匹配规则
目标文件在前,依赖文件在后。注意:这里的命令行前并不是空格,而是一个Tab。
目标文件:依赖文件
gcc 依赖文件 -o 目标文件 #执行的命令
举例:链接.o文件生成可执行文件main。
main: main.o sort.o
gcc main.o sort.o -o main -I./inc/ #这里-I./inc/表面头文件路径
在执行的命令中,我们可以使用下面符号来进行代替文件。
$@
:表示目标文件
$^
:表示依赖文件
main: main.o sort.o
gcc $^ -o $@ -I./inc/
6. all声明
执行make时,会无条件执行all声明下面的所有命令,为了不显示命令的输出,可以在命令前加上@。
all:
@make ARCH=arm64 CROSS_COMPILE=aarch64-linux- -C $(KDIR) M=$(PWD) modules
@rm -fr .tmp_versions *.o *.mod.o *.mod.c *.bak *.symvers *.markers *.unsigned