第一种方法:你可以在子目录中编写出第二个makefile文件,它的作用是编译该子目录下的源
文件,并将它们保存到一个函数库中,然后将该库文件复制到上一级的主目录中。在主目录中的
makefile文件包含一条用于制作函数库的规则,该规则会调用第二个makefile文件,如下所示
mylib.a:
(cd mylibdirectory;$(MAKE))
第二种方法是,在原来的makefile文件中添加一些宏。新添加的宏通过在我们已见过的宏的尾部
追加一个字母得到,字母D代表目录,字母F代表文件名。然后你就可以用下面的规则来替换内置的.c.o
后缀规则:
.c.o:
$(CC) $(CFLAGS) -c $(@D)/$(<F) -o $(@D)/$(@F)
这条规则的作用是:编译子目录中的源文件并将目标文件放在该子目录中。然后,你用如下的依赖关系
和规则来更新当前目录下的函数库:
mylib.a: mydir/2.o mydir/3.o
ar -rv mylib.a $?
第一种方法示例:
当前目录./Makefile_multi_dir
子目录:./mylib/makefile
当前目录./Makefile_multi_dir 文件内容
all: myapp mylib.a
#Which compiler
CC=gcc
#Where to install
INSTDIR=/usr/local/bin
#Where are include files kept
INCLUDE=.
#Options for development
CFLAGS=-g -Wall -ansi
#Options for release
#CFLAGS=-O -Wall -ansi
#Local Libraries
MYLIB=mylib.a
MAKE=make all
#.cqq.o:
%.cqq:%o
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
mylib.a:
cd mylib;$(MAKE);mv ./mylib.a ../mylib.a;
clean:
-rm main.o 2.o 3.o $(MYLIB) myapp
install: myapp
@if [ -d $(INSTDIR) ]; then \
cp myapp $(INSTDIR) && \
chmod a+x $(INSTDIR)/myapp && \
chmod og-w $(INSTDIR)/myapp && \
echo "Installed in $(INSTDIR)"; \
else \
echo "Sorry, $(INSTDIR) does not exist"; false; \
fi
子目录:./mylib/makefile 文件内容
all: mylib.a
MYLIB=mylib.a
#Where are include files kept
INCLUDE=.
#Options for development
CFLAGS=-g -Wall -ansi
#.cqq.o:
%.cqq:%o
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
2.o: 2.cqq a.h b.h
# $(CC) -c 2.cqq
3.o: 3.cqq b.h c.h
# $(CC) -c 3.cqq