Makefile编写学习
一、基本内容
1.功能:指定编译规则,将来程序编译按照规则进行,本质就是一个文本文件
2.语法:
核心要义:
目标:依赖1 依赖2 依赖3 ...依赖n
(TAB)规则 //依赖文件通过规则生成目标文件;必须是TAB
注:规则可以理解为编译命令
例如:
vi hello.c
vi Makefile
hello:hello.c
gcc hello.c -o hello
3.养成查阅字典的习惯:《GNU make v3.80完整版中文指南》
4.Makefile文件执行流程
参考代码
helloworld:helloworld.o
gcc helloworld.o -o helloworld
helloworld.o:helloworld.c
gcc -c helloworld.c -o helloworld.o
①当执行make命令时,make命令首先在当前目录下找Makefile文件
②找到后,make命令打开Makefile文件,然后找到所有的编译规则,最终确定要产生的目标文件(helloworld)和源文件(helloworld.c)
③如果目标文件(helloworld)存在,就检查它的依赖文件(helloworld.o)是不是最新的,如果是,说明文件被修改过,重新执行规则编译,生成最新的helloworld,如果依赖文件(helloworld.o)也是最新的,那么检查helloworld.o的依赖文件(helloworld.c)是不是最新的,如果是,说明文件被修改过,重新执行编译命令。
④如果在当前目录下目标文件(helloworld)不存在,make就会找到当前目录下是否存在它的依赖文件(helloworld.o),如果存在直接运行规则"gcc helloworld.o -o helloworld"生成helloworld即可;如果没有找到helloworld.o,那么就会找它的依赖文件hellworld.c是不是存在,存在直接执行"gcc -c helloworld.c -o helloworld.o"即可,不存在则报错!
总结:不管是时间戳的查找还是文件存在的查找,都是从上往下进行,而命令的执行是从下往上执行的
5.伪目标
①伪目标即没有依赖的目标
例如:
all:
编译命令A
clean:
编译命令B
当执行make all时,执行对应的编译命令A,当执行make clean时,执行对应的编译命令B
clean:
rm helloworld helloworld.o
优化:
.PHONY:clean
clean:
rm helloworld *.o
注:这样目标“clean”就是一个伪目标,无论当前目录下是否存在“clean”这个文件,只要输入“make clean”,就会被执行
6.Makefile多文件编写
main:main.o test.o
gcc main.o test.o -o main
test.o:test.c
gcc -c test.c -o test.o
main.o:main.c
gcc -c main.c -o main.o
clean:
rm main *.o
注:颠倒test和mian的编译不影响
7.Makefile编写技巧
①将所有的.c文件只编译不链接生成.o文件
%.o:%.c
gcc -c $< -o [email protected]
其中:
%.o:目标文件
%.c:源文件
[email protected]:生成的目标文件
$<:源文件
参考代码:
②变量的使用
Makefile中的变量类似C程序的#define宏,一般建议用大写;这样可以使Makefile的移植性更强,编写更加灵活
定义如下:
1)OBJ=main.o
2)OBJ:=main.o
3)OBJ=main.o
OBJ+=test.o
结果:OBJ=main.o test.o
4)OBJ?=main.o #如果OBJ先前赋过值,此句话则无效,否则有效
或者:
OBJ=mian.o
OBJ?=test.o
结果:OBJ=mian.o
5)引用变量的内容用"$(变量名)"
例如:$(OBJ)
参考代码: