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时,就会出现错误。
makeFile的错误
用make clean -f 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 := (patsubst(patsubst %.c,%.o,(patsubst(Source))
Modules += check_putin pack_message main
AllObjs := (addsuffix/src/∗.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 := (foreachb,(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
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐