makefile学习笔记

需求:程序的规模较大,将各个模块单独存放在子目录中,将头文件保存在include目录下,编写makefile文件可以实现对整个工程的编译。

 

学习过程:

1.了解makefile的基本规则,

http://wenku.baidu.com/view/8a70c58583d049649b665864.html

这篇文章是makefile的经典教材,网上找的makefile的大部分资料都是这篇文章,看完这篇文章后,自己写了makefile文件,

INCLUDE=./include
#VPATH=.:include:metadata_cache:metadata_op:lock
vpath %.h include
vpath %.c .:metadata_cache:metadata_op:lock
objects=metadata_bulk.o metadata_chain.o metadata_table.o metadata_big_table.o\
	metadata_cache_node.o metadata_cache.o mds_metadata_cache.o\
	metadata_op.o\
	metadata_lock.o\
	mds_radix_tree.o test.o
	
mds:$(objects)
	gcc -o mds $(objects) -I$(INCLUDE) -lpthread

metadata_bulk.o:metadata_bulk.c mds_metadata_cache.h
	gcc -I$(INCLUDE) -c metadata_cache/metadata_bulk.c
metadata_chain.o:metadata_chain.c mds_metadata_cache.h
	gcc -I$(INCLUDE) -c metadata_cache/metadata_chain.c
metadata_table.o:metadata_table.c mds_metadata_cache.h
	gcc -I$(INCLUDE) -c metadata_cache/metadata_table.c
metadata_big_table.o:metadata_big_table.c mds_metadata_cache.h
	gcc -I$(INCLUDE) -c metadata_cache/metadata_big_table.c
metadata_cache_node.o:metadata_cache_node.c mds_metadata_cache.h mds_lock.h
	gcc -I$(INCLUDE) -c metadata_cache/metadata_cache_node.c
metadata_cache.o:metadata_cache.c mds_metadata_cache.h
	gcc -I$(INCLUDE) -c metadata_cache/metadata_cache.c
mx_metadata_cache.o:mds_metadata_cache.c mds_metadata_cache.h
	gcc -I$(INCLUDE) -c metadata_cache/mds_metadata_cache.c
metadata_op.o:metadata_op.c mds_metadata_op.h mds_lock.h
	gcc -I$(INCLUDE) -c metadata_op/metadata_op.c
metadata_lock.o:metadata_lock.c mds_lock.h
	gcc -I$(INCLUDE) -c lock/metadata_lock.c
mx_radix_tree.o:mds_radix_tree.c mds_radix_tree.h
	gcc -I$(INCLUDE) -c mds_radix_tree.c
test.o:test.c mds_metadata_op.h
	gcc -I$(INCLUDE) -c test.c


发现指定的VPATH和vpath基本没有起到作用,子目录下的文件还是必须使用subdir/filename.c这样的格式,不能直接使用filename.c这样的格式替代。

 

2.找到了第二篇资料(发现第一篇的资料真的太泛滥的,百度makefile基本都是第一篇文章)

http://os.51cto.com/art/200806/75991.htm

这篇也是大概介绍了makefile的语法,另外介绍了一些生成库的方法,算是对第一篇文章的补充

 

3可以采用$内部定义的宏简化makefile的编写,最后和上面同样的方法,可以简化成如下形式

INCLUDE=./include

VPATH=.:metadata_cache:metadata_op:lock
#vpath %.h include
#vpath %.c .:metadata_cache:metadata_op:lock
objects=metadata_bulk.o metadata_chain.o metadata_table.o metadata_big_table.o\
	metadata_cache_node.o metadata_cache.o mx_metadata_cache.o\
	metadata_op.o\
	metadata_lock.o\
	mds_radix_tree.o test.o
	
mx:$(objects)
	gcc -lpthread -g -o $@ $^
%.o:%.c
	gcc -g -o $@ -c $< -I$(INCLUDE)
clean:
	rm -rf *.o mds
 

 

makefile内部宏能够极大的简化makefile的编写,而且对于一个很大的工程项目,使用这些内部宏,在添加、删除或是修改工程文件时,只需要对makefile稍做修改即可。

 

$@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标
中模式定义的集合。
$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar
.o)",那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是
[.a],Windows下是[.lib]),那么,其值为空。
$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符
合模式的一系列的文件集。注意,其是一个一个取出来的。
$?
所有比目标新的依赖目标的集合。以空格分隔。
$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会
去除重复的依赖目标,只保留一份。
$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$*
这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模
式是"a.%.b",那么,"$*"的值就是"dir /a.foo"。这个变量对于构造有关联的文件名是比
较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件
的后缀是 make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c"
,因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo"。这个特性是GNU make的
,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规
则或是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。


 

makefile资料:

http://wenku.baidu.com/view/8a70c58583d049649b665864.htmlmakefile   经典教程

http://os.51cto.com/art/200806/75991.htm   深入学习make命令

 http://www.opussoftware.com/tutorial/TutMakefile.htm   makefile tutorial

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值