Makefile的核心 ----规则:
大型的项目开发需要使用Makefile来给编译定规则;
Makefile的注意事项:
在Makefile中#是注释
在编写Makefile时第一个目标是执行Makefile后生成的最终目标;
Makefile命令能够被执行的条件:当目标文件不存在或某个依赖文件更新时执行命令;
1.显示规则
语法规则
目标:依赖1 依赖2 …
[TAB]命令
使用a.c编译出a.out文件,类似于递归调用,从后往前执行
Makefile
a:a.o
gcc a.o -o a
a.o:a.s
gcc -c a.s -o a.o
a.s:a.i
gcc -S a.i -o a.S
a.i:a.c
gcc -E a.c -o a.i
伪目标
如果要Makefile中使用rm -rf这种没有执行目标的指令就需要使用伪目标指令:
伪目标:.PHONY:
a:a.o
gcc a.o -o a
a.o:a.s
gcc -c a.s -o a.o
a.s:a.i
gcc -S a.i -o a.S
a.i:a.c
gcc -E a.c -o a.i
.PHONY
clearall:
rm -rf a.o a.S a.i a
clear:
rm -rf a.o a.S
上述的Makefile,如果在终端使用make clearall就会执行rm -rf a.o a.S a.i a,如果使用clear 就会执行rm -rf a.o a.S
多个文件生成可执行文件,使用a.c和b.c生成a.out
a.h
#include<stdio.h>
#include <stdlib.h>
void print();
~
a.c
#include <stdio.h>
#include <stdlib.h>
#include "a.h"
void print()
{
printf("this is from a\n");
}
b.c
#include <stdio.h>
#include <stdlib.h>
#include"a.h"
int main()
{
print();
}
~
Makefile:
a:a.o b.o
gcc a.o b.o -o a
a.o:a.c
gcc -c a.c -o a.o
b.o:b.c
gcc -c b.c -o b.o
.PHONY
clearAll:
rm -rf a.c b.c a.o b.o a
clearexcute:
rm -rf a
2.变量
替换:=
追加:+=
恒等于::=
类似于宏定义,在使用变量时需要以$(变量)的形式
Makefile原来的形式:
a:a.o b.o
gcc a.o b.o -o a
a.o:a.c
gcc -c a.c -o a.o
b.o:b.c
gcc -c b.c -o b.o
.PHONY
clearAll:
rm -rf a.c b.c a.o b.o a
clearexcute:
rm -rf a
使用变量的形式,以$(变量)进行替换
TAR = a
OBJ = a.o b.o
CC := gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o$(TAR)
a.o:a.c
$(CC) -c a.c -o a.o
b.o:b.c
$(CC) -c b.c -o b.o
.PHONY
clearAll:
rm -rf a.c b.c $(OBJ) a
clearexcute:
rm -rf $(TAR)
3.隐含规则
%c %o任意的.c文件或者任意的.o文件
*.c *.o所有的.c和所有的.o文件
对使用变量后的Makefile增加隐含规则
TAR = a
OBJ = a.o b.o
CC := gcc
$(TAR):$(OBJ)
$(CC) $(OBJ) -o$(TAR)
%.o:%.c
$(CC) -c %.c -o %.o
.PHONY
clearAll:
rm -rf a.c b.c $(OBJ) a
clearexcute:
rm -rf $(TAR)
4.通配符
$@:所有的目标文件
$^:所有的依赖文件
$<:所有的依赖文件的第一个文件
对使用隐含规则的Makefile添加通配符
TAR = a
OBJ = a.o b.o
CC := gcc
$(TAR):$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) -c $^ -o $@
.PHONY
clearAll:
rm -rf a.c b.c $(OBJ) a
clearexcute:
rm -rf $(TAR)
5.函数
参考博文