【Makefile】简单介绍

电子说

1.2w人已加入

描述

基本规则

makefile的规则,一般由以下组成

目标: 依赖列表
	命令列表

1、其中第一条规则中的”目标“,将会成为终极目标。我们最终目的,就是为了生成这个目标的

2、每一个规则中的目标。都可以是一个文件,也可以是一个标签

3、每一个规则中的目标,不一定要有依赖

目标:
	命令列表

此时的目标,我们成为”伪目标“

4、每一个规则,也不一定有命令列表

案例

假设我们有三个.c源文件,main.c、f1.c、f2.c

f1.c

#include "stdio.h"

void f1()

{

printf("This is f1
);

}

f2.c

#include "stdio.h"

void f2()

{

printf("This is f2
);

}

然后我们在main里面调用f1与f2这两个函数,接着编译、运行即可

下面我们编写一下Makefile

target:main.c f1.c f2.c
	gcc f1.c f2.c main.c

输入命令 make 即可完成编译

如果不想打印出gcc f1.c f2.c main.c这条命令,可以在Makefile文件中的命令列表前加上一个@符号

变量

创建变量,与shell类似

number = '56',此时,变量number的值就是56,

可以使用echo验证: echo &$number

其中这个符号$就是使用已声明的变量

变量的三种赋值方式

第一种:'=' 称为”延时展开赋值“
	例如:
		temp = $number
		number = '56'
	此时你输出'temp'等于56,所谓延时展开赋值就是当number成功赋值之后,再把number的值赋给temp
第二种:':='称为”立即展开赋值“
    例如:
		temp := $number
		number = '56'
	此时你输出'temp'就为空
第三种:'?='称为条件赋值
	例如:
		temp ?= $number
	假如在这之前没有给变量temp赋过值,那么就会把number的值赋给temp,反之就不会把number的值赋给temp

特殊变量

$@: 当前规则中的目标

$^: 当前规则中的所有依赖

$<: 当前依赖中的第一个

$$: 当前执行的进程的进程编号

$*: 模式规则中的所有%匹配的部分

$?: 模式规则中所有比所在规则中的目标更 新的文件组成的列表

下面借助变量优化一下上述案例的Makefile

SOURCE=main.c f1.c f2.c
target:$(SOURCE)
	gcc $^

模式规则

%.o: %.c
	gcc -c $<

%.c会匹配.c文件前面的部分,相当于shell中的*.c

模式规则执行时,是一个循环取出的过程,每次取出一个.c,调用命令生成对应的.o

模式规则举例

#strat
TARGET = a.out
SRCS = main.c

$(TARGET): $(SRCS:.c = .o)
	gcc $^ -o $@
#$(SRCS:.c=.o) 可以理解为目标所依赖文件是由.c文件生成的.o文件

#模式规则
%.o: %.c
	gcc -c $<   #模式规则每次取出一个,所以这里用$<

#end

写Makefile系列的文章是做个笔记,为了以后方便复习,里面应该有许多BUG,等学一段时间后会继续完善

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分