Linux开发工具之Makefile(下),开发工具makefile


二、Makefile(下)01.make常用内嵌函数函数调用  $(function arguments)$(wildcard PATTERN)  当前目录下匹配模式的文件  例如:src=$(wildcard *.c)$(patsubst PATTERN,REPLACEMENT,TEXT)  模式替换函数  例如:$(patsubst %.c,%.o,$src)  等价于$(src:.c=.o)shell函数  执行色狼来了命令  例如:$(shell ls -d */)#lsMakefile02.多级目录Makefile#touch main.c#mkdir bll(应用逻辑层)#mkdir ui(界面层)#mkdir dal(数据逻辑层)#cd ui#touch ui.h ui.c#cd ..#cd dll#touch dal.h dal.c#cd ..#cd bll#touch bll.h bll.c#lsbll dll Makefile ui#vi Makefile (有二级目录)CC = gccCFLAGS =-Wall -gBIN = mainSUBDIR = $(shell ls -d */)(当前目录下的所有文件夹)ROOTSRC = $(wildcard *.c)(当前目录下的所有*.c文件)ROOTOBJ = $(ROOTSRC:%.c=%.o)SUBSRC = $(shell find $(SUBDIR) -name '*.c')SUBOBJ = $(SUBSRC:%.c=%.o)$(BIN):$(ROOTOBJ) $(SUBOBJ) $(CC) $(CFLAGS) -o $(BIN) $(ROOTOBJ) $(SUBOBJ).c.o: $(CC) $(CFLAGS) -o $< -o $@clean: rm -f $(BIN) $(ROOTOBJ) $(SUBOBJ)#ls -d */(列出该目录下的文件夹都列出来)#find bll dll ui -name '*.c'bll/bll.cdll/dll.cui/ui.c#make#makeclean#ls03.Makefile可能生成多个可执行文件,如何只生成一个可执行文件#vi MakefileSUBDIRS = test1 test2.PHONYL:default all clean $(SUBDIRS)default:allall clean: $(MAKE) $(SUBDIRS) TARGET=$@$(SUBDIRS): $(MAKE) -C $@ $(TARGET)#cd . ./test1#vi MakefileCC = gccBIN = test1OBJS = test1.o.PHONY: all clean printall:print $(BIN)print @echo "----make all in $(PWD)----"$(BIN):$(OBJS) $(CC) $(OBJS) -o $@%.o:%.c $(CC) $(OBJS) -o $@%.o:%.c $(CC) -c $<clean: @echo "---- make clean in $(PWD) ----" rm -f $(BIN) $(OBJS)#cd ../test2#ls#vi MakefileCXX = g++(实现C++的编译)BIN = test2OBJS = test2.oCPPFLAGS=-Wall -g.PHONY: all clean printall:print $(BIN) @echo "---- make all in $(PWD) ----"$(BIN):$(OBJS) $(CXX) $(OBJS) -o $@.o:%.cpp $(CXX) -c $<clean: @echo "---- make clean in $(PWD) ----" rm -f $(BIN) $(OBJS)如果子目录下存在文件夹,也可以采用与顶层目录的Makefile类似的写法,实现多级目录,可扩展的方法。

相关内容