目录
- 背景
- 使用
- 推导过程
- 如果多个文件呢??
背景
- 会不会写
makefile
,从侧面可以说明一个人是否具有完成大型工程的能力 makefile
带来的好处就是——”自动化编译“,一旦写好,只需要一个make命令
,整个工程完全自动编译,极大提高了软件开发的效率make是一条命令,makefile是一个文件
使用
实例代码
#include <stdio.h>
int main()
{printf("hello linux!\n");return 0;
}
makefile文件
myproc:myproc.cgcc -o myproc myproc.c
.PHONY:clean
clean:rm -f myproc
依赖关系
myproc
,它依赖myproc.c
依赖方法
gcc -o myproc myproc.c
项目清理
- 工程需要被清理
- 像
clean
这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,我们需要”make clean"
来清除所有的目标文件,以便重新编译 - 一般这种
clean
的目标文件,我们将它设置成伪目标,用.PHONY
修饰,伪目标的特性,总是被执行
make怎么知道.c文件的新旧??
stat 文件名
$ stat myproc.cFile: myproc.cSize: 82 Blocks: 8 IO Block: 4096 regular file
Device: fc01h/64513d Inode: 655745 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ tc) Gid: ( 1000/ tc)
Access: 2025-02-01 16:11:58.322539017 +0800
Modify: 2025-02-01 16:09:53.805825660 +0800
Change: 2025-02-01 16:11:53.134509292 +0800
.PHONY
:让make忽略源文件和可执行目标文件的M时间对比
推导过程
make是如何工作的,在默认的方式下,也就是我们只输入make命令:
make
会在当前目录下找名字为"makefile"
或"Makefile"
的文件- 如果找到,它会找文件中的第一个
目标文件
,在上面的例子中,它会找myproc
这个文件,并把这个文件作为最终的目标文件 - 如果
myproc
文件不存在,那么,它会执行后面所定义的命令来生成myproc
这个文件 make
会一层一层地去找文件的依赖关系,直到最终编译出第一个目标文件- 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么
makefile
就会直接退出,并报错
如果多个文件呢??
BIN=myproc.exe #定义变量
CC=gcc
#SRC=$(shell ls *.c) #采用shell命令行方式,获取当前所有.c文件名
SRC=$(wildcard *.c) #或者使用wildcard 函数,获取当前所有.c文件名
OBJ=$(SRC:.c=.o) #将SRC的所有同名.c替换成.o形成目标文件列表
LFLAGS=-o #链接选项
FLAGS=-c #编译选项
RM=rm -f #引入命令$(BIN):$(OBJ) #$(BIN):替换,用变量内容替换它$(CC) $(LFLAGS) $@ $^ #$@:代表目标文件名 $^:代表依赖文件列表
%.o:%.c #%.c 展开当前目录下所有的.c %.o:同时展开同名.o$(CC) $(FLAGS) $< #%<:对展开的依赖.c文件,一个一个的交给gcc
.PHONY:clean
clean:$(RM) $(BIN) $(OBJ)