Chinaunix首页 | 论坛 | 博客
  • 博客访问: 364886
  • 博文数量: 83
  • 博客积分: 5322
  • 博客等级: 中校
  • 技术积分: 1057
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-11 11:27
个人简介

爱生活,爱阅读

文章分类

全部博文(83)

文章存档

2015年(1)

2013年(1)

2012年(80)

2011年(1)

分类: LINUX

2012-09-23 12:20:47

Makefile教程

1.     Make命令

1.      一个简单的

2.      编译若干文件

3.      分离编译(Separate compilation

4.      分离编译步骤

5.      分离你的C程序

2.   依赖关系(Dependencies

1.      依赖关系图表

2.      依赖关系是如何工作的

3.      Make是如何做的?

3.   文件

1.      解析依赖关系图表

2.      列出依赖关系

3.      使用make解析makefile

4.   Make快捷方式

1.      Make中的宏

2.      特殊的宏

3.      预定义规则

4.      各种各样的快捷方式

5.   

1.      特殊依赖关系

2.      用户化后缀与规则

文件

前面的部分描述了文件之间的依赖关系。在这个部分里,我们将通过make程序使用的文件:makefileMakefile来更加详细地介绍make。该文件确定了源代码,目标文件以及可执行文件之间的相互关系。

解析依赖关系图表

图表中显示的每一种依赖关系均用同样的颜色在Makefile中用圆圈圈住,并且使用下面的格式:

target : source file(s)

command (必须以tab键开头)

Makefile文件中指明的目标是一个即将被创建的,或者,当任何一个源文件发生改变时将被更新的文件。随后一行的命令(必须以tab开头)将被执行以生成目标文件。

列出依赖关系

project1: data.o main.o io.o

cc data.o main.o io.o -o project1

data.o: data.c data.h

   cc -c data.c

main.o: data.h io.h main.c

   cc -c main.c

io.o: io.h io.c

   cc -c io.c

注意,上面展示的Makefile列出了.h文件,但是却没有在相应的命令行中被引用。这是因为.h文件是通过#include file.h”的方式为对应的.c文件所引用。如果你没有明确地在makefile文件中包含这些头文件,那么,如果头文件(.h)发生改变的话,你的程序将不会得到更新。

注意:可以通过在注释内容前添加#的方式在Makefile中添加注释。

使用make解析Makefile

一旦你创建了Makefile以及对应的源文件,那么你已经准备好使用make了。如果你将Makefile文件命名为Makefile或者makefilemake将会自动识别它。如果你不想为你的makefile文件命名上述文件名的话,你可以使用make -f yourmakefile的方式。依赖关系的列出顺序是很重要的。如果你简单的输入make 然后回车,那么make将试图创建或者更新列出的第一个依赖关系。

你也可以在Makefile中指定一个其它的目标文件,并且只有该目标文件(与源代码文件相对应)被创建。例如,如果我们输入make,那么,make的输出如下所示:

% make

        cc -c data.c

        cc -c main.c

        cc -c io.c

        cc data.o main.o io.o -o project1

%

在生成目标时,make首先检查源文件(source file,而非source code file)并试图创建或者更新源代码。这就是为什么要在试图创建目标文件:project1之前,先创建data.o main.o 以及io.o

make的“快捷方式”

Make程序有许多前面部分么有被讨论过的其他特征。其中最重要的特征就是宏。

Make中的宏与C编程中使用的宏很相似。Make也拥有其自身的预定义规则(pre-defined rules),你可以利用它来使得你的makefile文件更加短小。

make中的宏

Make运行你使用宏,这里的宏同变量相似,用于存储文件名。其格式如下:
OBJECTS = data.o io.o main.o

无论何时,当你想在其运行时展开这些宏时,输入下面与之对应的字符$(OBJECTS)

下面是我们的示例makefile文件,其中使用了宏。

OBJECTS = data.o main.o io.o

project1: $(OBJECTS)

        cc $(OBJECTS) -o project1

data.o: data.c data.h

        cc -c data.c

main.o: data.h io.h main.c

        cc -c main.c

io.o: io.h io.c

        cc -c io.c

当你在运行make时,也可以指定宏的值,如下:
make 'OBJECTS=data.o newio.o main.o' project1

这将重写Makefile文件中OBJECTS的值。

预定义规则

By itself, make knows already that in order to create a .o file, it must use cc -c on the corresponding .c file. These rules are built into make, and you can take advantage of this to shorten your Makefile. If you just indicate just the .h files in the dependency line of the Makefile that the current target is dependent on, make will know that the corresponding .c file is already required. You don’t even need to include the command for the compiler.

This reduces our Makefile further, as shown:

Make自身已经知道:为了生成a.o文件,它必须在相应的.c文件上使用cc –c命令选项。这些规则已经内建在make内,你可以利用这一点来缩短makefile文件。如果在makefile文件中的依赖关系行中,仅仅指明了当前目标依赖的.h文件,那么make将自动知道需要相应的.c文件。你甚至都不需要为编译器指定相应的编译命令。这将进一步减小了你的makefile文件,如下所示:

OBJECTS = data.o main.o io.o

project1: $(OBJECTS)

        cc $(OBJECTS) -o project1

data.o: data.h

main.o: data.h io.h

io.o: io.h

然而,让我们考虑两外一件事情,当在Wiliki上编译程序时,你也许希望在Makefile的顶部添加一个CFLAGS宏,使得编译器采用ANSI标准的C编译器。这个宏如下所示:
CFLAGS=-Aa -D_HPUX_SOURCE

这将允许make按照预定义的规则使用ANSI C

各种各样的快捷方式

Although the examples we have shown do not explicitly say so, you can put more than one file in the target section of the dependency rules. If a file appears as a target more than once in a dependency, all of its source files are included as sources for that target.

尽管我们展示的例子中没有明确说明,但你可以在依赖规则的目标区域(target section of the dependency rules)放置多个文件。如果一个目标文件在依赖关系中出现了多次,那么所有相应的源文件都将作为目标文件的源文件。

下面是一个示例makefile文件:

CFLAGS = -Aa -D_HPUX_SOURCE

OBJECTS = data.o main.o io.o

project1: $(OBJECTS)

        cc $(OBJECTS) -o project1

data.o main.o: data.h

io.o main.o: io.h

Makefiel中显示main.o出现了两次。通过查看所有的依赖关系,make知道main.o依赖于datah以及io.h

高级特性

Make 有一些高级特性,我们将在本节中进行简单的讨论。包括特殊的依赖关系规则(specialized dependency rule),以及自定义后缀的makefile文件,还有书写新的“内建”规则。

特殊的依赖关系

通常,make使用相同的命令来创建或者更新目标文件,而不考虑哪个文件发生改变。一些其他文件,例如库文件,允许用户替代其一部分代码。为了此类特殊的行为,make允许一类特殊形式的依赖关系,此类特殊的依赖关系中其形式与普通的形式不同,这取决于哪个文件发生了变化。下面是此类规则的一个例子:

target :: source1

command1

target :: source2

command2

正如我们已经描述的那样,如果source1发生了改变,编译器将使用command1创建或者更新target,当source2发生变化时,则使用command2命令。

用户化后缀与规则(custom suffixes and rules

Make使用一类特殊的、称作.SUFFIXES的目标来定义你自己的后缀。例如,依赖关系行:
.SUFFIXES: .foo .bar

告诉make你将使用这些特殊的后缀来定义你自己的规则。同make已经知道的如何从.c文件生成.o文件相似,你可以通过下面的方式定义规则:

.foo.bar:

        tr '[A-Z][a-z]' '[N-Z][A-M][n-z][a-m]' < $< > $@

.c.o:

        $(CC) $(CFLAGS) -c $<

第一条规则允许你从.foo文件创建bar文件(不要担心它会做什么)。第二条规则是make用于从.c文件生成.o文件的默认规则。

 

阅读(2360) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~