一、Makefile规则
二、Makefile案例-多个文件生成一个目标文件
三、Makefile–生成多个目标文件
四、Makefile包含 头文件和库文件
目标:依赖
目标: 需要生成的目标文件
规则: 由依赖文件生成目标文件的的指令
依赖:生成目标文件所需要的一些文件
例如:
我们经常写 在命令行上一句话 搞定的 gcc hello.c -o hello,若果换成Makefile去写的话
hello:hello.c //目标是 hello.o 依赖是 hello.c
gcc hello.c -o hello //gcc这一行就是编译规则
make:
使用此命令即可按照预定的规则生成目标文件
如果Makefile文件的名字不为Makefile或者makefile.则应加上-f选项make -f Makefile_demo
make clean:
使用Make 命令 会生成 .o文件以及 可执行文件,使用make clean 可以清除掉.o文件和 可执行文件
如果当前目录下 存在clean这样文件,执行make clean 就无效了,最好的办法是 在makefile中 做为目标声明 .PHONY:clean
变量定义及赋值:
INCLUDE = ./include/
lib_path = ‘pwd’
A = $(lib_path) //用括号括起来 加个美元符号
通常都是大写,比如CC、PWD、CFLAG、、、
CPPFLAGS:预处理需要加的选项
CFLAG:编译的时候需要用的参数-Wall -g -c
LDFLAGS:链接库使用的选项 -L -l
- 表示此命令即使执行出错,也依然继续执行后续命令
-rm a.o hello.o hello
@ 不显示执行的命令,加上此符号,只执行命令,不显示指令规则
**$@**规则中的目标
$< 规则中的第一个依赖条件
$^ 规则中的所有依赖条件
例如:
test:main.o func1.o func2.o
gcc $^ -o $@
/*目标文件:test
依赖文件 main.o func1.o func2.o
$< 代表 main.o
$^代表 main.o func1.o func2.o
如果你 必须使用三个依赖 ,但是 使用的是$< ,那么后面两个依赖文件就不会被编译进去,编译就会报错 缺少依赖文件*/
模式规则是在目标以及依赖条件中使用%来匹配对应的文件,比如目录中有main.c func1.c func2.c三个文件,对这三个文件的编译可以由一条规则完成:
%.o:%.c //遍历每一个c文件 编译成o文件
$(CC) -c $< -o $@ //使用cc编译工具 -c 代表c文件 $< 使用第一个依赖 -o 表示生成目标文件 $@ 目标文件 也是 .o文件
mian.o由mian.c生成
func1.o由funci.c生成
func2.o由func2.c生成
makefile 也为我们提供 大量的函数 ,常用为以下两个:
注意 Mkefile中的所有函数必须都有返回值
wildcard:
用于查找指定目录下指定类型的文件,参数就是 目录+文件类型
src=$(wildcard ./src/*.c)
这句命令意思:找到 ./src目录下所有后缀为c的文件,并赋值给src
src的值: main.c func1.c func2.c
patsubst:
匹配替换,例如以下例子,用于从src目录中找到所有.c结尾的文件,并将其替换为.o文件,赋值给objobj = ( p a t s u b s t (patsubst %.c,%.o, (patsubst(src))之后obj的值为 main.o func1.o func2.o特别的,如果要把所有的.o文件放到 obj目录下,可以用以下方法:ob = ( p a t s u b s t . / s r c / (patsubst ./src/%.c,./obj/%.o, (patsubst./src/(src))