你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用Makefile工具

[复制链接]
gaosmile 发布时间:2021-2-22 21:49
为什么要使用Makefile工具?
当源码文件比较多的时候,不适合直接gcc命令来编译,这时候需要一个自动化编译工具来编译。Make 一般说是GNU Make 是一个软件,用于将源码文件编译器为可执行的二进制文件,make工具主要用于完整自动化编译,make编译的时候需要Makefile文件提供编译文件。
1、引入Makefile

  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文件,并且链接成可执行文件。

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执行文件。
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
复制代码

4、Makefile的通配符%和自动化变量
对于上面的Makefile如果有很多.c文件,那我们就需要写很多依赖规则,可以使用通配符来对其简化,%.c 表示所有的.c文件,%.o表示所有的.o文件,当然我们就可以把上面的!
b.o 依赖于 b.c和a.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  [        DISCUZ_CODE_0        ]lt;
  6. clean:
  7. rm *.o
  8. rm test
复制代码

5、Makefile伪目标
我们总是使用make clean来执行删除任务,单当我们在当前目录添加一个名为clean的文件,那么make clean还能奏效吗?如下:
微信图片_20210222214845.png
解决办法:使用伪目标,将clean定义为假想目标即可。

  1. objdect = a.o  b.o
  2. test:$(object)
  3.         gcc  –o  test  $(object)
  4. %.o: %.c
  5.         gcc  -c  [        DISCUZ_CODE_0        ]lt;
  6. clean:
  7.         rm *.o test
  8. .PHONY:clean
复制代码

6、Makefile条件判断Makefile同样支持条件判断,语法有两种如下:
<条件关键字>
       <条件为真时执行的语句>
endif

<条件关键字>
        <条件为真时执行的语句>
else
      <条件为假时执行的语句>
endif  
条件关键字:ifeq、ifneq、ifdef、ifndef,四个条件关键字分为两对:ifeq和ifneq用于是否相等;ifdef和ifndef 用于判断是否定义。

收藏 1 评论0 发布时间:2021-2-22 21:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版