用makefile向make描述代码

所有目标、依赖项和生成方法的细节信息需要保存在一个叫makefileMakefile的文件中,为了弄明白它是怎么工作的,下面假设要用一对源文件创建launch程序:

用makefile向make描述代码 - 图1

launch程序由launch.othruster.o文件链接而成,这两个文件又是由相应的C文件和头文件编译而成,launch.o文件还依赖thruster.h文件,因为thruster.c需要调用thruster.h中的函数。

你将在makefile中这样描述构建过程:

用makefile向make描述代码 - 图2

用makefile向make描述代码 - 图3

生成方法都必须以tab开头。

如果尝试用空格缩进,就无法生成程序。

用makefile向make描述代码 - 图4试驾

make规则保存在当前目录下一个叫Makefile的文本文件中,然后打开控制台,输入以下命令:

用makefile向make描述代码 - 图5

可以看到make为了创建launch程序执行了一连串的命令。但如果修改了thruster.c文件,再运行一次make,会发生什么呢?

用makefile向make描述代码 - 图6

make会跳过创建新的launch.o这一步,只编译thruster.o,然后重新链接程序。

这里没有蠢问题

问:make很像ant

:应该说antrake1这样的构建工具像make才对,make是最早出现的用来从源代码自动构建程序的工具。

1 antrake分别是基于Java和Ruby的构建工具。——译者注

问:编译源代码要做那么多事情,make真的那么管用吗?

:是的,make非常有用。对小项目来说,make可能节约不了太多时间,但一旦有很多文件,手动编译、链接它们会很痛苦。

问:如果我在Windows上写了一个makefile,在Mac或Linux上能用吗?

:makefile会调用底层操作系统的命令,所以有时不能在其他操作系统中使用。

问:除了编译代码,我能用make做其他事情吗?

:可以,虽然make一般用来编译代码,但你也可以用它充当命令行下的安装程序或源代码控制工具。事实上,任何可以在命令行中执行的任务,你都可以用make来做。

 

用makefile向make描述代码 - 图7古墓谜案

为什么要用tab缩进?

用空格缩进“生成方法”比用tab缩进方便多了,那么为什么make规定必须使用tab呢?这个嘛,make之父Stuart Feldman曾说过:

“为什么要在第一列中使用tab?……程序正确运行了,于是就保留了下来。几个星期以后,make拥有了几个用户,大部分是我的朋友,我又不愿破坏代码的基本结构。很遗憾,后来的事情你都知道了。”

 

用makefile向make描述代码 - 图8百宝箱

make减轻了编译文件时的痛苦,但如果你觉得它还不够自动化,可以试一试这个叫autoconf的工具:

http://www.gnu.org/software/autoconf/

autoconf可以用来生成makefile。C程序员经常创造工具来自动化软件开发,这类工具在GNU网站上的数量越来越多。

用makefile向make描述代码 - 图9make冰箱贴

嘿,宝贝,如果你跟不上节奏,一定会爱上Head First酒吧的人写的这个程序!oggswing程序读取Ogg格式的音乐文件,然后创建一首摇摆乐。宝贝!看看你能否完成makefile,它先编译oggswing,然后用它来转换.ogg文件。

用makefile向make描述代码 - 图10

用makefile向make描述代码 - 图11make冰箱贴解答

嘿,宝贝,如果你跟不上节奏,一定会爱上Head First酒吧的人写的这个程序!oggswing程序读取Ogg格式的音乐文件,然后创建一首摇摆乐。宝贝!你将完成makefile,它先编译oggswing,然后用它来转换.ogg文件。

用makefile向make描述代码 - 图12

用makefile向make描述代码 - 图13百宝箱

make可以做得更多,但是我们没有空间在这里讨论。关于make的更多信息和功能,请浏览 GNU Make Manual

http://tinyurl.com/yczmjx