什么是makefile?为什么需要用makefile?

描述

什么是makefile?为什么需要用makefile?

正常编译一个c文件,直接敲命令:

gcc hello.c -o hello
就行。

如果文件稍微多几个,gcc 里面多加几个问题也不大。

但是如果给你一个完整的项目工程,里面包含几千甚至几万个文件,而且又分成不同的文件夹,再去敲命令一个一个编译,显然有点不现实。

细心的同学会发现,凡是这些工程项目,里面都会有个叫Makefile的文件,要么这个文件直接存在,要么可以通过某种方式生成。

Makefile就是工程管理器,里面指定了本项目的编译规则。

先编译哪些,再编译哪些,要链接哪些库等等。

简单的Makefile确实挺简单,但是复杂的Makefile也很复杂。

下面来写个简单的Makefile。 假设现在只有一个源文件 hello.c。
root@turbo:~# ls
hello.c
root@turbo:~#
打开Makefile,先写目标文件,就是最终要生成的二进制,冒号后面写上依赖文件,就是通过哪个文件可以生成目标文件。
hello:hello.c
另起一行,先敲一下tab键,然后写编译的规则,就是我们平时敲的命令。
hello:hello.c
  gcc hello.c -o hello
执行Makefile,只要敲make就行,然后就能顺利编译。
make
再把文件增加两个。

Makefile中,目标文件不变,依赖文件以及下面编译规则都要增加两个文件。

这样确实麻烦了些。

Makefile里面也有变量一说,引用变量的时候,用 $ 符号。

有了变量,下次再增加什么文件,只要往后接就行。
Target=hello
Object=hello.c print.c show.c
$(Target):$(Object)
  gcc $(Object) -o $(Target)
不过一般依赖文件也不写成 .c ,因为最终的可执行文件都是由汇编后的文件合成,也就是多个 .o 文件经过链接变成了可执行文件,所以这里一般写成 .o 。
Target=hello
Object=hello.o print.o show.o
$(Target):$(Object)
  gcc $(Object) -o $(Target)
那 .o 文件又怎么来,下面可以继续写由 .c 生成 .o ,不过Makefile里面有隐含规则,所以这几行可以不写。

make的时候,过程很清晰,先从.c 变成 .o 再把 .o 合成最终的可执行文件。
root@turbo:~# make
cc    -c -o hello.o hello.c
cc    -c -o print.o print.c
cc    -c -o show.o show.c
gcc hello.o print.o show.o -o hello
root@turbo:~#
 



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分