webdancer's Blog

Makefile文件的书写

学习分析源代码,和自己在Linux底下Makefile文件的书写很重要。但是,这是一个逐渐积累的过程,先学一下基本的吧!

Makefile的语法较为复杂,可以参考GNU的官网。http://www.gnu.org/software/make/manual/make.html

1.make命令不仅使用在编译类型的程序文件,还是用于有几个输入文件产生输出文件的情况;比如是文档处理。

2.Makefile语法:

一个Makefile文件包含:依赖关系和规则. 一条依赖关系包含目标文件和它所依赖的源文件.规则:描述了如何由源文件产生目标文件。

目标文件: 源文件1 源文件2 [...]

<tab> 规则                       #(注:此处必须是tab键打头)。

     (1.)依赖关系:

目标文件产生所依赖的源文件,两者用:与空格分开;格式为:

目标文件: 源文件1 源文件2 […]

例如:

all: main.o 1.o 2.o

main.o: main.c a.h

1.o: 1.c a.h

2.o: 2.c b.h

注意: 在gcc 编译器中有 -MM选项,它可以产生依赖关系。所以,把它产生的输出到某个文件就可以了。

     (2)规则:

产生目标文件的语法,可以使用gcc 命令。格式为:

<tab> rules

3.#为注释。从行首到行末。

4.Makefile文件里的宏。

MACRONAME=VALUE

使用时${MACRONAME} 或者 $(MACRONAME)

宏经常用在编译器的选项上。

在make执行shell命令时,每一条命令会打开一个shell,所以加\來连接。

自定义变量:

AR 库文件维护程序的名称,默认值为 ar

AS 汇编程序的名称,默认值为 as

CC C 编译器的名称,默认值为 cc

CPP C 预编译器的名称,默认值为$(CC) –E

CXX C++编译器的名称,默认值为 g++

FC FORTRAN 编译器的名称,默认值为 f77

RM 文件删除程序的名称,默认值为 rm –f

ARFLAGS 库文件维护程序的选项,无默认值

ASFLAGS 汇编程序的选项,无默认值

CFLAGS C 编译器的选项,无默认值

CPPFLAGS C 预编译的选项,无默认值

CXXFLAGS C++编译器的选项,无默认值

FFLAGS FORTRAN 编译器的选项,无默认值

自动变量:

$* : 不包含扩展名的目标文件名称。

$+ : 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。

$< : 第一个依赖文件的名称 。

$? : 所有时间戳比目标文件晚的依赖文件,并以空格分开

$@: 目标文件的完整名称

$^ : 所有不重复的依赖文件,以空格分开

$% : 如果目标是归档成员,则该变量表示目标的归档成员名称

5。内建规则:

模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用 make 默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化 Makefile 的编写。

模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。使用模 式规则修改后的 Makefile 的编写如下:

OBJS = kang.o yul.o

CC = Gcc

CFLAGS = -Wall -O -g

sunq : $(OBJS)

$(CC) $^ -o $@

%.o : %.c

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

6.make 管理函数库:

函数库是一种目标文件的集合,后缀.a。make语法使得管理变得很简单,语法为:lib(file.o),可以把文件加入到函数库中。

7.make使用:

-C dir 读入指定目录下的 Makefile

-f file 读入当前目录下的 file 文件作为 Makefile

-i 忽略所有的命令执行错误

-I dir 指定被包含的 Makefile 所在目录

-n 只打印要执行的命令,但不执行这些命令

-p 显示 make 变量数据库和隐含规则

-s 在执行命令时不显示命令

-w 如果 make 在执行过程中改变目录,则打印当前目录名。



 




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee