目录
1.Makefile的重要性
2.MakeFile的概念
3.Makefile的优点
4.Makefile的基本语法
5.变量
5.1 自定义变量
5.2 变量的赋值
5.3自动变量
5.4 Makefile的隐含变量
6.Makefile的函数
6.1意义:
6.2 基本语法:
6.3 部分常用函数
6.4 自定义函数
make第一个语句满足后面就不会继续执行了,所以要把最终生成的语句放到最前面。
1.Makefile的重要性
如果要编译很多个文件时,写gcc很麻烦,但是用make一个命令就完成了。
2.MakeFile的概念
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
3.Makefile的优点
1. 自动化编译:一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发 的效率
2. 编译效率高:再次编译,只编译修改过的文件 通过文件的时间戳,判断文件是否修改过,从而提升编译效率
4.Makefile的基本语法
#一步编译.c->exe test:
test.c add.c sub.c
gcc test.c add.c sub.c -o test
#两步编译.c->.o->exe
test:test.o add.o sub.o
gcc test.o add.o sub.o -o test
test.o:test.c
gcc -c test.c -o test.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
#伪目标
.PHONY:clean
clean:
rm *.o test
5.变量
5.1 自定义变量
x = a 变量在声明时需要给予初值
$(x)或${x} 取值
如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
5.2 变量的赋值
#自定义变量及赋值
#SRC = test.o add.o sub.o
SRC = test.o
SRC += add.o
SRC += sub.o
#两步编译.c->.o->exe
test:$(SRC)
gcc $(SRC) -o test
test.o:test.c
gcc -c test.c -o test.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
#伪目标
.PHONY:clean
clean:
rm *.o test
5.3自动变量
#自动变量
#SRC = test.o add.o sub.o
SRC = test.o
SRC += add.o
SRC += sub.o
#两步编译.c->.o->exe
test:$(SRC) add.o
@echo "$$+ is $+"
@echo "$$^ is $^"
@echo "$$< is $<"
gcc $(SRC) -o $@
test.o:test.c
@echo "\$$* is $*"
@echo "\$$@ is $@"
gcc -c $^ -o $@
add.o:add.c
gcc -c $^ -o $@
sub.o:sub.c
gcc -c $^ -o $@
#伪目标
.PHONY:clean
clean:
rm *.o test
5.4 Makefile的隐含变量
#自动变量
SRC = test.o add.o sub.o
CC = gcc
CFLAGS = -c -g -Wall -I include
#两步编译.c->.o->exe
test:$(SRC)
$(CC) $(SRC) -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
#伪目标
.PHONY:clean
clean:
rm *.o test
6.Makefile的函数
6.1意义:
把一些功能封装起来
6.2 基本语法:
$( ) 或是 ${ }
6.3 部分常用函数
扩展通配符函数wildcard 语法: $(wildcard PATTERN...)
条件替换函数patsubst 语法: $(patsubst ,, )
#常用函数
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))
CC = gcc
CFLAGS = -c -g -Wall
#两步编译.c->.o->exe
test:$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
#伪目标
.PHONY:clean
clean:
rm *.o test
6.4 自定义函数
语法: $(call ;,;,;,;...)
#自定义函数
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))
#把$(SRC)中所有的.c换成.o
CC = gcc
CFLAGS = -c -g -Wall
define MYFUN
$(CC) $^ -o $@
echo $(1)
echo $(2)
endef
#两步编译.c->.o->exe
test:$(OBJ)
$(call MYFUN,"a",2)a
%.o:%.c
$(CC) $(CFLAGS) $^ -o $@
#伪目标
.PHONY:clean
clean:
rm *.o test