Linux——Makefile

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.函数
参考博文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值