设为首页 加入收藏

TOP

Makefile之大型工程项目子目录Makefile的一种通用写法
2014-11-24 07:15:05 来源: 作者: 【 】 浏览:0
Tags:Makefile 大型 工程项目 目录 通用 写法

管理Linux环境下的C/C++大型项目,如果有一个智能的Build System会起到事半功倍的效果,本文描述Linux环境下大型工程项目子目录Makefile的一种通用写法,使用该方法,当该子目录内的文件有增删时无需对Makefile进行改动,可以说相当的智能。


下面先贴代码(为减小篇幅,一些非关键的代码被去掉,本方法的局限是用于一个C文件生成一个可执行文件的场合):


ROOTDIR = .


EXE_DIR = ./bin
CFLAGS = -I$(INCLUDE_DIR) -I$(LIB_INC) -Wall
LFLAGS = -L$(LIB_DIR)


objects := $(patsubst %.c,%.o,$(wildcard *.c))
executables := $(patsubst %.c,%,$(wildcard *.c))


all : $(objects)
$(objects) :%.o : %.c
@mkdir -p ./bin$
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@
$(CROSS_COMPILE)gcc $(CFLAGS) $< -o $(subst .o, ,$(EXE_DIR)/$@) $(LFLAGS) $(LIBS)
clean:
@rm -f *.o rm -f $(executables)
@rm -rf ./bin
distclean: clean


假如当前目录里面有a.c b.c两个文件


Makefile 里的函数跟它的变量很相似——使用的时候,你用一个$符号跟左圆括号,函数名,空格后跟一列由逗号分隔的参数,最后用右圆括号结束。例如,在GNU Make里有一个叫'wildcard' 的函数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。像这个命令:

objects= $(wildcard *.c)

会产生一个所有以'.c' 结尾的文件列表(本例结果为a.c b.c),然后存入变量objects里。

另一个有用的函数是 patsubst ( patten substitude,匹配替换的缩写)函数。它需要3个参数——第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要处理由空格分隔的序列。我们将两个函数合起来用:

objects := $(patsubst %.c,%.o,$(wildcard *.c))
会被处理为:
objects := a.o b.o
同理:
executables := $(patsubst %.c,%,$(wildcard *.c))
会被处理为:
executables := a b

%o:所有以“.o”结尾的目标,也就是a.o b.o

依赖模式“%.c”:取模式“%.o”的%,也就是foo bar,并为其加上.c后缀,即a.c,b.c


$<:表示所有依赖目标集,也就是a.c b.c

$@:表示目标集,也就是a.o b.o

命令前加@,表示在终端中不打印,如@mkdir -p ./bin

$(objects) : %.o: %.c
$(CROSS_COMPILE)gcc -c $(CFLAGS) $< -o $@


即可翻译为:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇U-Boot之u-boot-2009.11启动过程.. 下一篇Makefile之写demo时的通用Makefil..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)