一、Makefile的概念
make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++下的make,LInux下GNU的make等等。
二、Makefile的优点
1、自动化编译
一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率
单个依赖流程图
多个依赖流程图
目标:指我们最终需要得到的结果 依赖:指生成这个结果所需要的文件
2、编译效率高
通过文件的时间戳,判断文件是否修改过,若修改过则只执行修改的部分,从而提高了编译的效率
三、Makefile的基本语法
target :prerequisites ...... ;
command
①target-->就是一个目标文件,可以使Object文件,也可以是执行文件,还可以是一个标签(Label),对于标签
②prerequisites-->就是要生成目标文件所需要的文件或目标
③command-->就是make需要执行的命令(任意的shell命令)
/*一步编译*/
test:add.c sub.c test.c
gcc add.c sub.c test.c -o test //将这三个.c文件直接生成test可执行文件
/*多步编译*/
test:add.o sub.o test.o
gcc add.o sub.o test.o -o test //通过这个三个.o文件生成test可执行文件
add.o:add.c
gcc -c add.c -o add.o //通过.c文件生成.o文件
sub.o:sub.c
gcc -c sub.c -o sub.o
test.o:test.c
gcc -c test.c -o test.o
.PHONY:clean //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean: //clean是伪目标,其无依赖文件
rm *.o //删除所有过程文件(.o文件)
四、变量
1、自定义变量
①x=a 变量在声明时需要给予初值
②$(x)或${x} 取值
③如果要使用真实的$字符,则需要用$$表示
2、变量的赋值
① = 最基本的赋值方式,与在文中的位置无关,系统自动推导将最终的赋值作为该变量的值
② ?= 当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值
③ := 覆盖赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值
④ += 追加赋值,旧值保持不变,将新值黏贴到旧值后面
SRC=add.o sub.o test.o //定义一个变量SRC,将三个.o文件赋值给SRC
test:$(SRC)
gcc ${SRC} -o test //通过变量SRC的值生成test可执行文件
add.o:add.c
gcc -c add.c -o add.o //通过.c文件生成.o文件
sub.o:sub.c
gcc -c sub.c -o sub.o
test.o:test.c
gcc -c test.c -o test.o
.PHONY:clean //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean: //clean是伪目标,其无依赖文件
rm *.o //删除所有过程文件(.o文件)
SRC=add.o
SRC+=sub.o
SRC+=test.o
test:$(SRC)
gcc ${SRC} -o test //通过变量SRC的值生成test可执行文件
add.o:add.c
gcc -c add.c -o add.o //通过.c文件生成.o文件
sub.o:sub.c
gcc -c sub.c -o sub.o
test.o:test.c
gcc -c test.c -o test.o
.PHONY:clean //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean: //clean是伪目标,其无依赖文件
rm *.o //删除所有过程文件(.o文件)
3、自动变量
① $* 不包含扩展名的目标文件名称
② $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能会有重复的依赖文件
③ $^ 所有不重复的目标依赖文件,以空格分开
④ $< 第一个依赖文件的名称
⑤ $@ 目标文件的完整名称
SRC=add.o
SRC+=sub.o
SRC+=test.o
test:$(SRC)
gcc $^ -o $@
add.o:add.c
gcc -c $< -o $@
sub.o:sub.c
gcc -c $< -o $@
test.o:test.c
gcc -c $< -o $@
.PHONY:clean //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean: //clean是伪目标,其无依赖文件
rm *.o //删除所有过程文件(.o文件)
4、Makefile的隐含变量
①CC C编译器的名称,默认值为cc
②CPP C预编译器的名称,默认值为$(CC)
③CXX C++编译器的名称,默认值为g++
④CFLAGS C编译器的选项,无默认值
⑤CPPFLAGS C预编译器的选项,无默认值
⑥CXXFLAGS C++编译器的选项,无默认值
SRC = add.o sub.o test.o
CC = gcc
CFLAGS = -c -g -Wall
test:$(SRC)
$(CC) $^ -o $@
%.o:%.c //使用通配符,什么.c配什么.o
$(CC) $(CFLAGS) $< -o $@
.PHONY:clean //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean: //clean是伪目标,其无依赖文件
rm *.o //删除所有过程文件(.o文件)
五、Makefile的函数
1、意义
把一些功能封装起来,类似于C语言中的类
2、基本语法
①$(<function> <arguments>)
②${<function> <arguments>}
3、部分常用函数
①扩展通配符函数wildcard $(wildcard PATTERN...)
②条件替换函数patsubst $(patsubst <pattern>,<replacement>,<text>)
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c,%.o,$(SRC))
CC = gcc
CFLAGS = -c -g -Wall
test:$(OBJ)
$(CC) $^ -o $@
%.o:%.c //使用通配符,什么.c配什么.o
$(CC) $(CFLAGS) $< -o $@
.PHONY:clean //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean: //clean是伪目标,其无依赖文件
rm *.o //删除所有过程文件(.o文件)