經過不斷的實驗,終于改出來了一個可以用于多個子目錄,多個文件的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]$收工。
新聞熱點
疑難解答