Makefile总结

Makefile总结

搬运于正点原子文档

1.首先,Makefile是什么?

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile 就像一个 Shell 脚本一样,其中也可以执行操作系统的命令。

2.Makefile的引入
一个小工程,包含main.c,a.c,b.c,a.h,b.h三个c文件和两个头文件。
通过以下命令进行编译最终得到可执行文件main

gcc main.c a.c b.c -o main

在这种编译方法中,如果有一个文件被修改了,使用上面的命令编译的时候所有的文件都会重新编译,这在大型的工程中会浪费很多时间,我们想要的是哪个文件被修改,哪个文件就单独重新编译,或者那个头文件被修改,包含这个头文件的c文件就重新编译,没有改动的c文件则不需要重新编译。

下面改变编译方法。

gcc -c main.c
gcc -c a.c
gcc -c b.c
gcc main.o a.o b.o -o main

使用-c选项对main.c,a.c,b.c三个c文件只进行编译而不进行链接,最后用命令将编译出来的所有.o 文件链接成可执行文件 main。假如现在修改了a.c 这个文件,只需要将a.c 这一个文件重新编译成.o 文件,然后在将所有的.o 文件链接成可执行文件即,只需要下面两条命令即可:gcc -c a.c gcc main.o a.o b.o -o main
但是这样又产生了一个问题,如果修改的文件比较多,很难记得哪个文件修改过了。

因此,对于以上问题,我们需要一个工具来完成以下功能:

  • 如果这个工程没有编译过,那么我们的所有 C 文件都要编译并被链接。
  • 如果这个工程的某几个 C 文件被修改,那么我们只编译被修改的 C 文件,并链接目 标程。
  • 如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的 C 文件, 并链接目标程序。

能够完成这个功能的就是 Makefile 了。

3.Makefile 的规则格式:
Makefile 里面是由一系列的规则组成的,这些规则格式如下:

目标…... : 依赖文件集合……
命令 1
命令 2
……

例如:

 main: main.o a.o b.o
 	gcc -o main main.o a.o b.o
 main.o: main.c
 	gcc -c main.c
 a.o: a.c
 	gcc -c a.c
 b.o: b.c
 	gcc -c b.c
 
 clean:
 	rm *.o
 	rm main

这条规则的目标是 main,main.o a.o b.o是生成 main 的依赖文件,如果要更新目标 main,就必须要先更新它的所有依赖文件,如果依赖文件中的任何一个有更新,那么目标也必须更新,“更新”就是执行一遍规则中的命令列表。

命令列表中的每条命令必须以 TAB 键开始,不能使用空格

首先更新第一条规则中的 main,第一条规则的目标成为默认目标,只要默认目标更新了那么就认为完成了 Makefile 的工作,完成了整个 Makefile 就是为了完成这个工作。

最后一个规则目标是 clean,它没有依赖文件,因此会默认为依赖文件都是最新的,所以其对应的命令不会执行,当我们想要执行 clean 的话可以直接使用命令“make clean”,执行以后就会删除当前目录下所有的.o 文件以及 main,因此clean 的功能就是完成工程的清理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值