1. makefile里的内置变量
编辑makefile,代码如下:
mg=add.o sub.o mul.o div.o main.o,内置变量为mg;
在之后用到add.o sub.o mul.o div.o main.o时,可以用$(mg)
mg=add.o sub.o mul.o div.o main.o
cal:$(mg)
@gcc add.o sub.o mul.o div.o main.o -o cal
//也可以写成
//gcc $(mg) -o cal
//makefile里有函数
//gcc $(mg) -o $@
add.o:add.c
@gcc -c add.c -o add.o
sub.o:sub.c
@gcc -c sub.c -o sub.o
mul.o:mul.c
@gcc -c mul.c -o mul.o
div.o:div.c
@gcc -c div.c -o div.o
main.o:main.c
@gcc -c main.c -o main.o
.PHONY:clean
clean:
@rm -rf *.o cal
内置变量定义的三种形式:
mg=add.o sub.o mul.o div.o main.o
mg:=add.o sub.o mul.o div.o main.o
mg +=add.o sub.o mul.o div.o main.o //注意+前有空格
2. makefile的命名注意点
当将makefile重命名为Makefile时,make仍有用;但是将makefile重命名为makeFile时,就会出现错误。
用make clean -f makeFile就能解决,如下图:
3. 企业级makefile编号
- 1、总控makefile:进入各个功能的子目录执行make命令,并将所有.o文件生成可执行文件。
- 2、功能目录makefile:将功能目录下的所有.c文件编译成.o文件。
- 3、脚本目录makefile:定义其他makefile文件所用到的变量。
对于企业级makefile的阅读顺序:3 — 1 — 2
4.关于脚本目录scripts中makefile的一些函数
下列是脚本目录makefile:
CC := gcc
CFLAGS := -Wall -O3 //-Wall显示所有警告信息,-O3是最高优化选项
Libs = -lpthread
Target := client
Source := $(wildcard src/*.c)
Objs := ( p a t s u b s t (patsubst %.c,%.o, (patsubst(Source))
Modules += check_putin pack_message main
AllObjs := ( a d d s u f f i x / s r c / ∗ . o , (addsuffix /src/*.o, (addsuffix/src/∗.o,(Modules))
相关函数:
1、$(wildcard 模式参数)
- 功能:列出所有符合模式参数的文件名
- 例子:result := $(wildcard *.c)
return(返回)当前目录下所有.c文件
2、$(patsubst 模式参数,参数1,参数2)
- 例子:result := $(patsubst %.c,%.o,x.c,y.c)
result := x.o y.o
3、:=
- 功能:赋值,防止后面变量出现死循环
- 例子:
(1)a1 := a.o a2 := $(a1) b.o
则a1 = a.o,a2 = a.o b.o
(2)a1 := $(a2) b.o a2 := a.o
则a1 = b.o,a2 = a.o
4、+=
- 功能:给变量追加值
- 例子:a1 = a.o a1 += b.o,则a1 = a.o b.o
相当于a1 = a.o a1 := $(a1) b.o,则a1 = a.o b.o
5.关于总控makefile中的函数
1、$(foreach 变量参数,参数1,表达式)
- 功能:循环取出参数1里的单词赋值给变量参数,然后运行表达式。
- 返回值:表达式的结果
- 例子:a := x y z result :=
(
f
o
r
e
a
c
h
b
,
(foreach b,
(foreachb,(a),$(b).c),
则result = x.c y.c z.c
2、$(call 变量函数,参数…)
- 功能:循环把参数依次赋值给变量中的 ( 1 ) 、 (1)、 (1)、(2)…
- 返回值:赋值后的变量值
- 例子:a := $(2) $(1) result := $(call $(a),x y),
则result = yx