打印
[单片机资料]

MakeFile工具

[复制链接]
469|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
为什么要使用Makefile工具?
当源码文件比较多的时候,不适合直接gcc命令来编译,这时候需要一个自动化编译工具来编译。Make 一般说是GNU Make 是一个软件,用于将源码文件编译器为可执行的二进制文件,make工具主要用于完整自动化编译,make编译的时候需要Makefile文件提供编译文件。

使用特权

评论回复

相关帖子

沙发
一路向北lm|  楼主 | 2020-4-29 09:51 | 只看该作者
引入Makefile

gcc  a.c  b.c  -o  test
a.c------>***.s------>***.o
b.c------>xxx.s------>xxx.o
xxx.o + ***.o ------>test
缺点:修改任一个文件所有.c都要重新编译,文件更多时可想而知,时间耗不起!
改进:应该分别编译,最后再链接
gcc  -c  a.c  
gcc  -c  b.c
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文件,如下所示
test: a.o  b.o
        gcc  –o  test  a.o  b.o
a.o:   a.c
        gcc  -c  a.c
b.o:   b.c
        gcc  -c  b.c
clean:
rm *.o
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, 具体如下:
objdect = a.o  b.o
test: $(object)
        gcc  –o  test  $(object)
a.o:   a.c
        gcc  -c  a.c
b.o:   b.c
        gcc  -c  b.c
clean:
rm *.o
rm test



使用特权

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



使用特权

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


使用特权

评论回复
7
一路向北lm|  楼主 | 2020-4-29 09:54 | 只看该作者
6.Makefile条件判断
Makefile同样支持条件判断,语法有两种如下:
  
<条件关键字>
  
        <条件为真时执行的语句>
  
endif
  
  
<条件关键字>
  
        <条件为真时执行的语句>
  
else
  
       <条件为假时执行的语句>
  
endif
  
条件关键字:ifeqifneqifdefifndef,四个条件关键字分为两对:ifeqifneq用于是否相等;ifdefifndef 用于判断是否定义。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

258

主题

3647

帖子

73

粉丝