注意:本章使用第十一章的源码 直接编译生成可执行文件 不在生成库
一种简单的方法就是将所有源文件都设置到VPATH路径下。然后像普通makefile 生成。我们不讨论这种情况。
先来看我们程序的目录组织结构
--- main.c
---common.h
---addsub
--- add.c
--- sub.c
---muldiv
--- mul.c
--- div.c
Makefile组织:
1、各个子目录单独使用Makefile,主要生成相关的库,或者目标文件;
2、顶层Makefile负责将本目录下源代码文件编译成目标文件,并依次进入各种子目录编译生成相关库文件,最后进行链接,生成可执行文件。
该Makefile关键语句如下:
for dir in $(SUBDIRS);
do $(MAKE) -C $$dir all || exit 1;
done
done
意思是进入指定子目录,并执行子目录的Makefile文件(子目录只负责生成库文件)。
addsub 子目录下makefile
#***************************************************************************** # # Author : wolfRickWang # Date : 2013/7/17 星期三 13:27:22 # #****************************************************************************/ SHELL = /bin/sh CC = gcc CFLAGS = -c SOURCES = add.c sub.c OBJECTS = $(SOURCES:.c=.o) all:$(OBJECTS) %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -f *.o .PHONY: all clean
muldiv 子目录下makefile
#***************************************************************************** # # Author : wolfRickWang # Date : 2013/7/17 星期三 13:27:22 # #****************************************************************************/ SHELL = /bin/sh CC = gcc CFLAGS = -c SOURCES = div.c mul.c OBJECTS = $(SOURCES:.c=.o) all:$(OBJECTS) %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -f *.o .PHONY: all clean
主目录makefile
#***************************************************************************** # # Author : wolfRickWang # Date : 2013/7/17 星期三 13:27:22 # #****************************************************************************/ SHELL = /bin/sh CC = gcc CFLAGS = -c EXECUTABLE = main SUBDIRS := muldiv addsub SOURCES = main.c OBJECTS = $(SOURCES:.c=.o) # add all sub obj ALLOBJECTS = $(OBJECTS) ./muldiv/mul.o ./muldiv/div.o ./addsub/add.o ./addsub/sub.o all : $(EXECUTABLE)
# ALLOBJECTS 这里不能依赖这些文件,因为这些.o 在子目录makefile中生成,再此查找不到也找不到生成它们的方法 所以会出错
$(EXECUTABLE): $(OBJECTS)
for dir in $(SUBDIRS); do make -C $$dir all || exit 1; done $(CC) $(ALLOBJECTS) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: for dir in $(SUBDIRS); do make -C $$dir clean|| exit 1; done rm -f *.o $(EXECUTABLE) .PHONY: all clean
上面基本展示了一个多目录MAKEFILE书写的范例,现在如果要把上面的源文件换成库文件 也很容生成。 有兴趣的朋友可以尝试书写,本代码已经经过本人测试。