3.11.3 makefile的一个例子
正如提到的那样,代码提取工具ExtractCode.cpp自动地为每章产生makefile文件。因为这个原因,makefile并未放在书中每一章(所有的makefile文件都和源代码一起打包,可以从www.BruceEckel.com下载)。
然而看一个makefile的例子是有意义的。以下是一个例子的简化版本,该例子由本书中的代码提取工具自动生成。可以在每个子目录中(它们有不同的名字,用‘make-f’调用)发现多个makefile文件。下面的例子是用于GNU C++的:
CPP宏被设置为编译器的名字。为了使用不同的编译器,可以编辑makefile文件,或者在命令行上修改宏的值,例如:
注意,对于另外编译器,ExtractCode.cpp代码具有自动建立makefile的方案。
第二个宏OFLAG是一个标志,用于指定输出文件的名字。虽然许多编译器自动假定输出文件的名字与输入的文件名一致,但是还是有例外(如Linux/Unix编译器,它默认创建一个a.out的输出文件)。
可以看出本例有两条后缀规则,一条用于cpp文件,另一条用于.c文件(以防需要编译C代码)。默认的目标是all,对于目标的所有的行用反斜线符号表示继续,直到Guess2,它是目标列表中的最后一行,因此不再需要反斜线符。本章有许多文件,为简单起见,这里只列出了一些文件。
后缀规则管理从cpp文件创建目标文件(以.o作为扩展名),但是通常对创建可执行文件需要有显式说明的规则,因为一个可执行文件通常是通过连接许多不同的目标文件而产生的,而make程序不知道哪些是目标文件。同样,在某些情况(Linux/Unix)下,对于可执行文件并无标准扩展名,这种情况下,后缀规则将不能工作。所以,我们发现创建最终执行文件都显式说明了规则。
makefile采用最安全的路线,其中尽可能少地使用make特征;在宏中也使用了目标、依赖性和宏的最基本的make概念。这种方式实质上保证能与尽可能多的make程序共同工作。这可能会生成较大的makefile,但这不是很糟的事,因为它是通过ExtractCode.cpp自动产生的。
有许多本书中未使用的其他make特征,以及更新和更加灵活的make版本和变型,其中具有可以大量节约时间的高级的快捷用法。本地文档可以对特定的make做更加详尽的描述,也可以从Oram和Talbott所著的《Managing Projects with Make》(O’Reilly,1993)一书中学到关于make的更多的知识。如果有的编译器提供商不能支持make或者它使用非标准的make,可以从Internet上搜索GNU文档(有许多GNU文档)找到GNU make程序,这种程序实际上支持已经存在的所有平台。