经过不断的实验,终于改出来了一个可以用于多个子目录,多个文件的Makefile模板,只用来生成静态库文件,后面再继续添加内容吧
先来看下目录结构
[zhang@zwfedora23 libs]$ tree.├── Makefile├── src│ ├── libs1.c│ ├── libs1.h│ ├── libs2.c│ ├── libs2.h│ └── main.c├── src1│ ├── libs1a.c│ ├── libs1a.h│ ├── libs1.c│ └── libs1.h└── src2 ├── libs2.c └── libs2.h3 directories, 12 files[zhang@zwfedora23 libs]$具体的Makefile文件内容:
LIB_SRC1 = ./src1LIB_SRC2 = ./src2LIB_A := libs.a#VPATH = $(LIB_SRC1) $(LIB_SRC2)SRC := $(wildcard $(LIB_SRC1)/*.c)SRC += $(wildcard $(LIB_SRC2)/*.c)OBJS := $(patsubst %.c,%.o,$(SRC))CC:=gccCFLAGS:= -I./.PNONY:all cleanall: $(LIB_A)clean: @rm -f $(OBJS) @rm -f $(LIB_A) $(OBJS):%.o:%.c $(CC) -c $(CFLAGS) $^ -o $@$(LIB_A):$(OBJS) @echo '$$OBJS'=$(OBJS) @echo '$$(SRC)/*.c'=$(SRC) @echo '$$@' = $@ @echo '$$^' = $^ @echo '$$<' = $< $(AR) rcv $@ $^仔细看的话,其实这个Makefile中也没有什么东西,也大概完全可以看懂,但是在今天之前要是让我从0开始手写或者在别人的Makefile中改出一个来我还真有点含糊。但是现在不会了,今天晚上试了好多终于有成果了。 看下最后执行的效果:
[zhang@zwfedora23 libs]$ makegcc -c -I./ src1/libs1.c -o src1/libs1.ogcc -c -I./ src1/libs1a.c -o src1/libs1a.ogcc -c -I./ src2/libs2.c -o src2/libs2.o$OBJS=./src1/libs1.o ./src1/libs1a.o ./src2/libs2.o$(SRC)/*.c=./src1/libs1.c ./src1/libs1a.c ./src2/libs2.c$@ = libs.a$^ = src1/libs1.o src1/libs1a.o src2/libs2.o$< = src1/libs1.oar rcv libs.a src1/libs1.o src1/libs1a.o src2/libs2.oa - src1/libs1.oa - src1/libs1a.oa - src2/libs2.o[zhang@zwfedora23 libs]$ tree.├── libs.a├── Makefile├── src│ ├── libs1.c│ ├── libs1.h│ ├── libs2.c│ ├── libs2.h│ └── main.c├── src1│ ├── libs1a.c│ ├── libs1a.h│ ├── libs1a.o│ ├── libs1.c│ ├── libs1.h│ └── libs1.o└── src2 ├── libs2.c ├── libs2.h └── libs2.o3 directories, 16 files[zhang@zwfedora23 libs]$可以看到,每个.c文件对应的.o文件都在同一个目录,最后的.a文件在项目的根目录,这正是我想要的,一点都不差。而且我还写了个main.c来测试生成的.a文件,结果也是正确的。
[zhang@zwfedora23 libs]$ gcc src/main.c -L./ -ls -o test[zhang@zwfedora23 libs]$ ./test hellohello,libs2[zhang@zwfedora23 libs]$ lslibs.a Makefile src src1 src2 test[zhang@zwfedora23 libs]$收工。
新闻热点
疑难解答