分享
 
 
 

GNU中的Makefile

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

来源: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下进行.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有