makefile的使用

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

1.Makefile的优势
(1)自动化编译,一次写好,永久使用,如果修改也只是改动一小部分。
(2)提高工作效率:编译时,只需要输入make命令就可以生成可执行文件;make执行过程中,会只编译被修改了的文件。

2.Makefile的编写
假如有4个.c文件,分别是main.c(存放测试代码,有main函数) insert.c (链表的插入)delete.c(链表的删除) init.c(链表的初始化),一个.h(存放函数的声明)文件,要生成的目标文件为main。用gcc进行编译的写法是 gcc -o main main.c insert.c delete.c init.c,然后生成可执行文件main,但是每次若修改了其中的某个.c文件,再次执行时则需要重新输入以上命令,比较麻烦。但是使用makefile只需要一个make命令就可以完成,make会自动寻找已经被修改的文件并重新编译。

Makefile的写法有好多种,有的看起来一目了然,但是代码量多,有的代码简洁,但是无法让人一眼看懂make编译的规则。

以下简单介绍几种:
(1)最完整的写法:

这里写图片描述

其中main是目标文件,它的依赖文件有main.o insert.o delete.o intit.o,而这些.o文件的依赖文件是.c文件。

那么编译器如何知道哪些文件需要被重新编译呢。事实上,如果文件被修改,那么的它的时间就要新一点,若将目标文件main与其他文件进行比较,根据时间的不同查找出哪些文件是被修改的文件。然后编译器就会执行这个文件的gcc,重新生成可执行文件。
每行命令必须以tab键开头,表示此行是命令行。

(2)使用变量
使用变量,代替多个文件,其实Makefile的变量就是一个字符串,相当于C语言中的宏

这里写图片描述

第2中方法与第一种方法唯一的不同就是使用了变量,用val代替main.o insert.o delete.o intit.o,其他的没有改变,目标文件依旧是main。当文件比较多时就可以使用变量,而且若有新的文件添加起来也比较方便。

(3)gcc自动编译

这里写图片描述

若采用自动编译的方法,我们连gcc的步骤都可以省略,不需要输入以tab键开头的命令(这样也可以免去我经常忘记以tab键开头的烦恼啦~)。

(4)make自动寻找.c文件并编译

这里写图片描述

这一个方法不仅不需要手动输入gcc,甚至.o文件的依赖文件.c文件都不需要我们指定了。make非常强大,当它发现一个.o文件时,会自动把这个文件名的.c文件添加进来,比如make发现了main.o文件那么它会自动推导出main.c文件,再自动进行gcc的编译。

但是,这还不够,make的强大使它还可以用更奇(ke)葩(pa)的方法来写。

(5)充分使用变量的怪异风格

这里写图片描述
这一个方法,写起来更简单了,三行就可以解决。
但是,如果对这种方法不熟悉的人,看到这种写法,会想:这都是什么鬼啊,逻辑关系看不懂啊。

所以,我还是推荐使用第一种方法或第二种方法,虽然写起来有点多,但是逻辑关系一目了然。

3.清空目标文件

clean:
    rm main $(val)

但更为稳健的做法是:

.PHONY:clean
clean:
    -rm main $(val);

这里的clean不是一个文件,只是一个动作,clean的冒号后面什么也没有,所以make不会去寻找它的依赖文件,也不会执行它的命令,所以需要我们手动执行,即make clean。所以上面的.PHONY表示,clean只是一个伪目标文件。

4.Makefile文件命名规则
Makefile的文件名,尽量用makefile或Makefile,不要用GUNmakefile。
我们也可以用别的文件名来书写Makefile,但是需要用参数-f或–file进行指定。如make -f makelinux.

5.makefile常见错误

1.漏写了 冒号

这里写图片描述

2.gcc的时候漏写了目标文件main
应该为gcc -o main main.c insert.c delete.c init.c

这里写图片描述

附:我好像突然发现了一点很奇怪的事,我写的Makefile第8行我用的.o文件名是initt.o,与第一行init.c名称不一致,竟然也编译成功。不是说Initt.o会自动推导与它名称一致的.c文件吗,可是它推导出来的initt.c本来是不存在的,难道make的功能这么强大??

这里写图片描述

这里写图片描述

这个问题先留在此,我想明白了再来补充答案。。。。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值