在线课堂:https://www.100ask.net/index(课程观看) 论 坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taobao.com/ (淘宝) https://weidongshan.tmall.com/(天猫) 交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载) 交流群二:QQ群:536785813(单片机-嵌入式) 公 众 号:百问科技
版本日期作者说明V12020韦东山技术文档在 Linux 中使用 make 命令来编译程序,特别是大程序;而 make 命令所执行的动作依赖于 Makefile 文件。最简单的 Makefile 文件如下:
hello: hello.c
gcc -o hello hello.c
clean:
rm -f hello
将上述 4 行存为 Makefile 文件(注意必须以 Tab 键缩进第 2、4 行,不能以空格键缩进),放入 01_hello目录下,然后直接执行 make 命令即可编译程序,执行“make clean”即可清除编译出来的结果。
make 命令根据文件更新的时间戳来决定哪些文件需要重新编译,这使得可以避免编译已经编译过的、没有变化的程序,可以大大提高编译效率。
要想完整地了解 Makefile 的规则,请参考《GNU Make 使用手册》,以下仅粗略介绍。
3.1 配套视频内容大纲 3.1.1 Makefile 规则与示例参考文档:gunmake.htm
① 为什么需要 Makefile 怎么高效地编译程序? 想达到什么样的效果?请参考 Visual Studio:修改源文件或头文件,只需要重新编译牵涉到的文件, 就可以重新生成 APP
② Makefile 其实挺简单 一个简单的 Makefile 文件包含一系列的“规则”,其样式如下:
目标(target)…: 依赖(prerequiries)…
命令(command)
如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目标文件”。命令被执行的 2 个条件:依赖文件比目标文件新,或是 目标文件还没生成。
③ 先介绍 Makefile 的 2 个函数 A. $(foreach var,list,text) 简单地说,就是 for each var in list, change it to text。 对 list 中的每一个元素,取出来赋给 var,然后把 var 改为 text 所描述的形式。
例子:
objs := a.o b.o
dep_files := $(foreach f, $(objs), .$(f).d) // 最终 dep_files := .a.o.d .b.o.d
B. $(wildcard pattern) pattern 所列出的文件是否存在,把存在的文件都列出来。 例子:
src_files := $( wildcard *.c) // 最终 src_files 中列出了当前目录下的所有.c` 文件
④ 一步一步完善 Makefile 第 1 个 Makefile,简单粗暴,效率低:
test : main.c sub.c sub.h
gcc -o test main.c sub.c
第 2 个 Makefile,效率高,相似规则太多太啰嗦,不支持检测头文件:
test : main.o sub.o
gcc -o test main.o sub.o
main.o : main.c
gcc -c -o main.o main.c
sub.o : sub.c
gcc -c -o sub.o sub.c
clean:
rm *.o test -f
第 3 个 Makefile,效率高,精炼,不支持检测头文件:
test : main.o sub.o
gcc -o test main.o sub.o
%.o : %.c
gcc -c -o $@ $
关注
打赏
- 韦东山freeRTOS系列教程:入门文档教程+进阶视频教程(全部免费的freeRTOS系列教程、freeRTOS学习路线)
- 韦东山嵌入式Linux三大学习路线
- 新人怎样学习嵌入式Linux?
- 【RTOS训练营】作业讲解、队列和环形缓冲区、队列——传输数据、队列——同步任务和晚课提问
- 【RTOS训练营】任务调度(续)、任务礼让、调度总结、队列和晚课提问
- 【RTOS训练营】上节回顾、空闲任务、定时器任务、执行顺序、调度策略和晚课提问
- 【RTOS训练营】设备子系统、晚课学员提问
- 【RTOS训练营】继续程序框架、tick中断补充、预习、课后作业和晚课提问
- 【RTOS训练营】程序框架、预习、课后作业和晚课提问
- 【RTOS训练营】环形缓冲区、AT指令、预习安排和晚课提问