|
|
GNU中的Makefile |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
来源:LinuxEden 在开发大系统时,经常要将程序划分为许多模块.各个模块之间存在着各种各样的依赖关系,在 UNIX 中通常使用 Makefile来管理 .Makefile其实很复杂,我向大家推荐由Stallman写的手册,那里有最详尽的描述.这里只想说一些最常用的功能.
先举一个例子: 有a.c b.c两个程序. a.c extern void p(char *); main() { p("hello world"); }
b.c #include void p(char *str) { printf("%sn",str); }
Makefile hello:a.c b.c gcc a.c b.c -o hello ---- 这里是一个Tab(注意一定要有一个Tab)
执行make gcc a.c b.c -o hello 产生一个叫hello的可执行程序.
Makefile时由规则来组成的,每一条规则都有三部分组成:目标(object),依赖(dependency)和命令(command).在上面的例子中, Makefile只有一条规则,其目标为hello,期依赖为a.c b.c,其命令为gcc a.c b.c -o hello.
依赖可以是另一条规则的目标,也可以是文件.每一条规则被这样处理.如目标是一个文件是:当它的依赖是文件时,如果依赖的时间比目标要新, 则运行规则所包含的命令来更新目标; 如果依赖是另一个目标则用同样的方法先来处理这个目标.如目标不是一个存在的文件时,则一定执行.
例如: Makefile hello:a.c b.o gcc a.c b.o -o hello b.o:b.c gcc b.c -c
当运行 make时,可以接一目标名作为参数,表示要处理改目标.如没有参数,则处理第一个目标.对上一个例子执行 make ,则是处理hello这个目标. hello依赖于文件a.c和另一个目标 b.o,则先去处理b.o,调用gcc b.c -c来更新b.o,之后返回,调用gcc a.c b.o -o hello 来更新hello.
定义变量: 在makefile中可以定义自己的变量,例如: CC = gcc hello:a.c b.c $(CC) a.c b.c
特殊变量: $@ 目标的名字 $< 第一个依赖的名字 $^ 所有的依赖 $? 依赖中所有新于目标的
缺省规则: make自己有一些缺省的方法来处理它遇到的文件. 如: makefile hello:a.o b.o gcc a.o b.o -o hello
make gcc a.c -o a.o gcc b.c -o b.o gcc a.o b.o -o hello make自动去调用gcc来编译产生a.o和b.o.
可是问题在于我们经常要改变缺省规则,如在开发时我们希望加上参数 -g 来加上调试信息.用下面的方法来完成这一需要: %.o:%.c gcc -c $< -g -o $@ 其中的%是通配符.
伪目标: .PHONY:target 伪目标的命令一定会被执行. 例如 clean: rm a.o b.o clean的目的很简单,就是要删除所有的.o的文件.但这样写,如果处在着一个名为clean的文件时就会产生问题.加上下面一行: .PHONY:clean 使make知道这是一个伪目标就可以了.
设置搜索路径 例如: ~/program/a.c ~/program/include/a.h
makefile vpath %.h include a.c:a.h
make首先在本目录下寻找, 然后在vpath指定的目录下找.本例中, 以 .h 位扩展名的文件会在~/program/include/下寻找.
一个稍稍复杂的例子: a.h a.c b.h b.c
makefile
OBJECTS = a.o b.o #使用的编译器 CC = gcc #所需的参数 FLAGS = -g #要连接的库 LIB = -lcrypt
a.c:a.h b.c:b.h # .o 的文件会自动依赖于 .c 的文件. %.o:%.c gcc -c $< -o $@ $(FLAGS) $(LIB) all:$(OBJECTS) gcc $(OBJECTS) -o hello
.PHONY:clean clean: rm $(OBJECTS)
当你执行make时,首先,make去找GNUmakefile如没有找makefile, 最后找 Makefile. 但出于兼容性的考虑和醒目的原因, 一般使用Makefile.也可以用 -f filename 来特殊指定.
make的一些常用的参数: -k 忽略错误,继续运行. -C dir 在dir下进行.

|
|
相关文章:相关软件: |
|