当前位置:网站首页>Makefile笔记(一文学会Makefile)
Makefile笔记(一文学会Makefile)
2022-06-30 18:30:00 【嵌入式悦翔园】
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile就像一个Shell脚本一样,也可以执行操作系统的命令。
1、Makefile规则格式
想要掌握makefile,首先需要了解两个概念,⼀个是⽬标(target),另⼀个就是依赖(dependency)。⽬标就是指要⼲什么,或说运⾏ make 后⽣成什么,⽽依赖是告诉 make 如何去做以实现⽬标。在 Makefile 中,⽬标和依赖是通过规则(rule)来表达的。
目标XX1:依赖文件
<TAB>命令1
<TAB>命令2
目标XX2:依赖文件
<TAB>命令1
<TAB>命令2
... ...
指令1:
命令1
命令2
指令2:
命令1
命令2
... ...
示例:
Tag:a.o b.o c.o
gcc -o Tag a.o b.o c.o
a.o: a.c
gcc -c a.c
b.o: b.c
gcc -c b.c
c.o: c.c
clean:
rm .o
rm Tag



2、规则说明
Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令,其结构如下所示:
targets: prerequisites
[Tab]command
相关说明如下:
targets:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;prerequisites:是我们的依赖文件,要生成 targets 需要的文件或者是目标。可以是多个,也可以是没有;command:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
注意:我们的目标和依赖文件之间要使用冒号分隔开,命令的开始一定要使用Tab键。
通过下面的例子来具体使用一下 Makefile 的规则,Makefile文件中添代码如下:
test:test.c
gcc -o test test.c
上述代码实现的功能就是编译 test.c 文件,通过这个实例可以详细的说明 Makefile 的具体的使用。其中 test 是的目标文件,也是我们的最终生成的可执行文件。
依赖文件就是 test.c 源文件,重建目标文件需要执行的操作是 gcc -o test test.c。这就是 Makefile 的基本的语法规则的使用。使用 Makefile 的方式:首先需要编写好 Makefile 文件,然后在 shell 中执行 make 命令,程序就会自动执行,得到最终的目标文件。
3、C文件编译过程
-E :预处理 --> 将.h .c 展开形成一个文件,并生成.i文件;
gcc -E hello.c -o hello.i
-S :编译 --> 将预处理后的.i文件编译成汇编文件.s;
gcc -S hello.i -o hello.s
-c :汇编 --> 将编译后的.s文件编译成为机器语言.o;
gcc -c hello.s -o hello.o
-o :机器语言 --> 将目标文件中的函数、变量等进行链接;
gcc hello.o -o hello
文件格式变化过程:
.c --> .i -->.s --> .o --> 目标
4、伪目标的使用
.PHONY 是Makefile文件的关键字,表示它后面列表中的目标均为伪目标。
一般使用伪目标进行清理语句的书写,例如以下语句:
.PHONY:clean
clean:
rm -rf hello main.c func1.o func2.o
因为,我们并不生成 clean 这个文件。伪目标 并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以 make 无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个 目标 才能让其生效。当然,伪目标 的取名不能和文件名重名,不然其就失去了伪目标 的意义了。
5、多.c文件的Makefile
例如存在文件:a.cb.cd.ce.c 需要最后得到main
则代码书写格式如下:
main:a.o b.o d.o e.o
gcc a.o b.o d.o e.o -o main
a.o:a.c
gcc -c a.c -o a.o
b.o:b.c
gcc -c b.c -o b.o
d.o:d.c
gcc -c d.c -o d.o
e.o:e.c
gcc -c e.c -o e.o
6、变量的使用
下面这些是常用的预定义变量。
$* 不包含扩展名的目标文件名称。
$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$< 第一个依赖文件的名称。
$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
[email protected] 目标的完整名称。
$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。$% 如果目标是归档成员,则该变量表示目标的归档成员名称。
其中常用的是[email protected]$^ 这两个,我们将上面的代码使用变量修改后如下:
TAR =main
OBJ = main.o a.o b.o c.o
CC := gcc
RMRF := rm -rf
$(TAR):$(OBJ)
$(CC) $^ -o [email protected]
%.o:%.c
$(CC) -c $^ -o [email protected]
#这句话可以代替所有的相同格式的语句;
.PHONY:
clear:
$(RMRF) $(OBJ)
其中TAR =mainOBJ = main.o a.o b.o c.oCC := gccRMRF := rm -rf 为自定义变量,其余带 $ 符号的为系统预定义变量。
7、隐晦规则
复杂一些的Makefile我们不可能一条一条的写,则时候隐晦规则就展示了他的强大,我们下面一起来看一看隐晦规则的具体使用。
根据上面的结构说明,我们对Makefile一层一层的改写,首先是隐晦规则,告诉大家其中一种用法:
TAR =main
OBJ = main.o a.o b.o c.o
CC := gcc
RMRF := rm -rf
$(TAR):$(OBJ)
$(CC) $^ -o [email protected]
%.o:%.c
$(CC) -c $^ -o [email protected]
#这句话可以代替所有的相同格式的语句;
.PHONY:
clear:
$(RMRF) $(OBJ)
其中下面几个语句就是隐晦规则的书写,我们可以使用这几句话代替上百行代码。
%.o:%.c
$(CC) -c $^ -o [email protected]
这个隐晦规则其实就是告诉大家,后缀为 .c 的文件怎么编译成 .o,后缀为c的文件怎么编译成 .o。
到目前为止的Makefile已经有模有样了!,下面给大家分享一下具体的代码执行过程:
8、写在最后
最后,加几点写Makefile的注意事项
1. tab分隔,不能用空格。
2. 每个makefile最好加一个all
3. 注释用“#”符号
4. 文件指示,引用其他的makefile文件
边栏推荐
- Practical application of "experience" crawler in work
- MySQL modify data type_ MySQL modify field type [easy to understand]
- Go redis connection pool
- Word——Word在试图打开文件时遇到错误的一种解决办法
- 【DesignMode】工厂模式 (factory pattern)
- Cobbler轻松上手
- CTF流量分析常见题型(二)-USB流量
- [JetsonNano] [教程] [入门系列] [一] 如何开启VNC共享
- 究竟有哪些劵商推荐?另外,手机开户安全么?
- DTD modeling
猜你喜欢

Four tips tell you how to use SMS to promote business sales?
![[JetsonNano] [教程] [入门系列] [一] 如何开启VNC共享](/img/f5/3f0f69739caa22809f40cf4b7483fe.png)
[JetsonNano] [教程] [入门系列] [一] 如何开启VNC共享

Lenovo Yoga 27 2022, full upgrade of super configuration

微信小程序快速入门 --项目介绍

Gateway服务网关

小小笔记-整型提升(C语言)

Swin-transformer --relative positional Bias

4个技巧告诉你,如何使用SMS促进业务销售?

France a+ France VOC label highest environmental protection level

如何使用物联网低代码平台进行服务管理?
随机推荐
Four tips tell you how to use SMS to promote business sales?
Unlimited cloud "vision" innovation | the 2022 Alibaba cloud live summit was officially launched
阿里天池SQL训练营学习笔记5
究竟有哪些劵商推荐?另外,手机开户安全么?
Personally test the size of flutter after packaging APK, quite satisfied
基于STM32单片机的测温仪
设计电商秒杀系统
How JS correctly clears all child elements under an element
Ambient light and micro distance detection system based on stm32f1
小球大小随机,随机运动碰撞
20200525-生物技术-四川师范大学自考生物技术(本科)考试计划.txt
法国A+ 法国VOC标签最高环保级别
Year after year, why is breaking the data island still the primary task of enterprise development
VMware16安装Win11虚拟机(最全步骤+踩坑)
「经验」爬虫在工作中的实战应用『理论篇』
Coding officially entered Tencent conference application market!
小小笔记-整型提升(C语言)
Video content production and consumption innovation
CTF flow analysis common questions (II) -usb flow
com. alibaba. fastjson. Jsonobject tojsonstring eliminate circular reference