用makefile向make描述代码
所有目标、依赖项和生成方法的细节信息需要保存在一个叫makefile或Makefile的文件中,为了弄明白它是怎么工作的,下面假设要用一对源文件创建launch
程序:
launch
程序由launch.o和thruster.o文件链接而成,这两个文件又是由相应的C文件和头文件编译而成,launch.o文件还依赖thruster.h文件,因为thruster.c需要调用thruster.h中的函数。
你将在makefile中这样描述构建过程:
生成方法都必须以tab开头。
如果尝试用空格缩进,就无法生成程序。
试驾
将make
规则保存在当前目录下一个叫Makefile的文本文件中,然后打开控制台,输入以下命令:
可以看到make
为了创建launch
程序执行了一连串的命令。但如果修改了thruster.c文件,再运行一次make
,会发生什么呢?
make
会跳过创建新的launch.o这一步,只编译thruster.o,然后重新链接程序。
这里没有蠢问题
问:
make
很像ant
?答:应该说
ant
和rake
1这样的构建工具像make
才对,make
是最早出现的用来从源代码自动构建程序的工具。1
ant
和rake
分别是基于Java和Ruby的构建工具。——译者注问:编译源代码要做那么多事情,
make
真的那么管用吗?答:是的,
make
非常有用。对小项目来说,make
可能节约不了太多时间,但一旦有很多文件,手动编译、链接它们会很痛苦。问:如果我在Windows上写了一个makefile,在Mac或Linux上能用吗?
答:makefile会调用底层操作系统的命令,所以有时不能在其他操作系统中使用。
问:除了编译代码,我能用
make
做其他事情吗?答:可以,虽然
make
一般用来编译代码,但你也可以用它充当命令行下的安装程序或源代码控制工具。事实上,任何可以在命令行中执行的任务,你都可以用make
来做。
古墓谜案
为什么要用tab缩进?
用空格缩进“生成方法”比用tab缩进方便多了,那么为什么
make
规定必须使用tab呢?这个嘛,make
之父Stuart Feldman曾说过:“为什么要在第一列中使用tab?……程序正确运行了,于是就保留了下来。几个星期以后,
make
拥有了几个用户,大部分是我的朋友,我又不愿破坏代码的基本结构。很遗憾,后来的事情你都知道了。”
百宝箱
make
减轻了编译文件时的痛苦,但如果你觉得它还不够自动化,可以试一试这个叫autoconf
的工具:http://www.gnu.org/software/autoconf/
autoconf
可以用来生成makefile。C程序员经常创造工具来自动化软件开发,这类工具在GNU网站上的数量越来越多。
make冰箱贴
嘿,宝贝,如果你跟不上节奏,一定会爱上Head First酒吧的人写的这个程序!oggswing
程序读取Ogg格式的音乐文件,然后创建一首摇摆乐。宝贝!看看你能否完成makefile,它先编译oggswing
,然后用它来转换.ogg文件。
make冰箱贴解答
嘿,宝贝,如果你跟不上节奏,一定会爱上Head First酒吧的人写的这个程序!oggswing
程序读取Ogg格式的音乐文件,然后创建一首摇摆乐。宝贝!你将完成makefile,它先编译oggswing
,然后用它来转换.ogg文件。
百宝箱
make
可以做得更多,但是我们没有空间在这里讨论。关于make
的更多信息和功能,请浏览 GNU Make Manual: