makefile
简述makefile
-
makefile是一个文件,里面放的是编译的规则,可以管理多个文件
-
make是一个工具,用来解析我们的makefile
-
make会根据文件的时间戳进行编译,如果文件的时间戳没有改变,则不会编译文件
-
makefile的逻辑
-
目标文件:依赖文件
(tab) 编译语句
目标文件就是我们最终生成的文件,要生成这个文件,会去找生成它需要的文件,就叫做依赖文件,如果依赖文件又需要其他的文件来生成,继续找它的依赖文件,直到不需要为止
-
app:list.o main.o
gcc list.o main.o -o app
list.o:list.c
gcc -c list.c -o list.o
main.o:main.c
gcc -c main.c -o main.o
clean:
rm main.o list.o app
-
make clean 删除生成的文件(执行clean后面的语句)
-
执行:make,默认解析当前目录下的makefile或者Makefile
-
选项
-
-f ---- 编译指定的makefile文件
-
-I(大写的i) ---- 调用外部头文件 加头文件的路径
-
1 app:list.o main.o
gcc list.o main.o -I ./include -o app
list.o:list.c
gcc -c list.c -I ./include -o list.o
main.o:main.c
gcc -c main.c -I ./include -o main.o
clean:
rm main.o list.o app
makefile的变量
变量的赋值:
- =:给当前变量赋值,但是如果后面有新的赋值,把新的赋值给变量
a=12
b=$(a)
a=34
all:
@echo $(b)
输出:b=34
- :=—立即赋值,和平时的赋值一样,后面新的赋值不会改变当前值
a=12
b:=$(a)
a=34
all:
@echo $(b)
输出:b=12
- ?=—询问赋值,询问前面有没有赋值,如果有,此次赋值无效
a=12
b:=$(a)
a?=34
all:
@echo $(b)
echo $(a)
a=12
- +=:追加赋值
a=12
b:=$(a)
a+=hello
all:
@echo $(b)
echo $(a)
a=12 hello
-
可以在语句前加@隐藏显示语句
-
利用变量写makefile:
TARGET=app
OBJS=list.o main.o
CC=gcc
OBJS2=list.c
OBJS3=main.c
PATH=-I ./include
$(TARGET):$(OBJS)
$(CC) $(OBJS) $(PATH) -o $(TARGET)
list.o:$(OBJS2)
$(CC) -c $(OBJS2) $(PATH) -o list.o
main.o:$(OBJS3)
$(CC) -c $(OBJS3) $(PATH) -o main.o
clean:
rm $(OBJS) $(TARGET)
- 特殊的变量:
- $@—目标文件
- $^—所有依赖文件
- $<:第一个依赖文件
- 通配符:%
TARGET=app
OBJS=list.o main.o
CC=gcc
OBJS2=list.c
OBJS3=main.c
path=-I ./include
$(TARGET):$(OBJS)
$(CC) $^ $(path) -o $@
%.o:%.c
$(CC) -c $^ $(path) -o $@
clean:
rm $(TARGET) $(OBJS)