[单片机资料] MakeFile工具

[复制链接]
907|6
 楼主| 一路向北lm 发表于 2020-4-29 09:49 | 显示全部楼层 |阅读模式
为什么要使用Makefile工具?
当源码文件比较多的时候,不适合直接gcc命令来编译,这时候需要一个自动化编译工具来编译。Make 一般说是GNU Make 是一个软件,用于将源码文件编译器为可执行的二进制文件,make工具主要用于完整自动化编译,make编译的时候需要Makefile文件提供编译文件。

 楼主| 一路向北lm 发表于 2020-4-29 09:51 | 显示全部楼层
引入Makefile

gcc  a.c  b.c  -o  test
  1. a.c------>***.s------>***.o
  2. b.c------>xxx.s------>xxx.o
  3. xxx.o + ***.o ------>test
缺点:修改任一个文件所有.c都要重新编译,文件更多时可想而知,时间耗不起!
改进:应该分别编译,最后再链接
  1. gcc  -c  a.c  
  2. gcc  -c  b.c
  3. gcc  a.o  b.o  –o  test
为此需要一个这样的工具:

01.如果工程没有编译过,那么工程中的所有.c文件都要被编译并且链接成可执行程序。
02.如果工程中只有个别C 文件被修改了,那么只编译这些被修改的C 文件即可。
03.如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的C 文件,并且链接成可执行文件。




 楼主| 一路向北lm 发表于 2020-4-29 09:52 | 显示全部楼层
2.makefile 的基本规则: 当依赖比目标新执行命令
目标文件:依赖文件
TAB  命令
根据Makefile的基本规则,我们针对上面的gcc编译过程来写一个Makefile文件,如下所示
  1. test: a.o  b.o
  2.         gcc  –o  test  a.o  b.o
  3. a.o:   a.c
  4.         gcc  -c  a.c
  5. b.o:   b.c
  6.         gcc  -c  b.c
  7. clean:
  8. rm *.o
  9. rm test
这样我们使用 make 命令就可以完成对 a.c  b.c的编译和链接,直接生成test执行文件。


 楼主| 一路向北lm 发表于 2020-4-29 09:52 | 显示全部楼层
3.makefile 的变量
Makefile 也可以添加变量,但Makefile跟C语言不一样,没有类似于 int char …等很多的类型,只有字符串类型,比如可以定义一个 object = a.o b.o  引用变量使用$(objdect)即可。
这样就可以将上面的Makefile尽心简化,不需要输入两次的 a.o b.o, 具体如下:
  1. objdect = a.o  b.o
  2. test: $(object)
  3.         gcc  –o  test  $(object)
  4. a.o:   a.c
  5.         gcc  -c  a.c
  6. b.o:   b.c
  7.         gcc  -c  b.c
  8. clean:
  9. rm *.o
  10. rm test



 楼主| 一路向北lm 发表于 2020-4-29 09:53 | 显示全部楼层
4.Makefile的通配符 %和自动化变量
对于上面的Makefile如果有很多.c文件,那我们就需要写很多依赖规则,可以使用通配符来对其简化,%.c 表示所有的.c文件,%.o表示所有的.o文件,当然我们就可以把上面的!
b.o 依赖于 b.ca.o依赖于a.c 等写成 %.o 依赖%.c的形式。对于命令则需要引入另一个叫做自动化变量了,如何通过一行命令来从不同的依赖文件中生成对应的目标?自动化变量就是用来实现这个功能的。在自动化变量中常用的是$@$<$^
$@ : 规则中目标集合
$< :依赖文件集合中的第一个文件
$^ :所有依赖文件的集合
这样我们又可以对MakeFile进行简化啦……….,如下所示:
  1. objdect = a.o  b.o
  2. test: $(object)
  3.         gcc  –o  test  $(object)
  4. %.o: %.c
  5.         gcc  -c  lt;
  6. clean:
  7. rm *.o
  8. rm test



 楼主| 一路向北lm 发表于 2020-4-29 09:54 | 显示全部楼层
5.Makefile伪目标
我们总是使用make clean来执行删除任务,单当我们在当前目录添加一个名为clean的文件,那么make clean还能奏效吗?如下:
解决办法:使用伪目标,将clean定义为假想目标即可。
  1. objdect = a.o  b.o
  2. test: $(object)
  3.         gcc  –o  test  $(object)
  4. %.o: %.c
  5.         gcc  -c  lt;
  6. clean:
  7.         rm *.o test
  8. .PHONY:clean
再次make clean 可以正常对make产生的文件尽心清理。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 一路向北lm 发表于 2020-4-29 09:54 | 显示全部楼层
6.Makefile条件判断
Makefile同样支持条件判断,语法有两种如下:
  
<条件关键字>
  
        <条件为真时执行的语句>
  
endif
  
  
<条件关键字>
  
        <条件为真时执行的语句>
  
else
  
       <条件为假时执行的语句>
  
endif
  
条件关键字:ifeqifneqifdefifndef,四个条件关键字分为两对:ifeqifneq用于是否相等;ifdefifndef 用于判断是否定义。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部