在Makefile基礎中總結了makefile最常用的基礎,利用這些知識點,足矣編寫通用makefile運用于c/c++項目中。本文基于這樣的檔案編寫makefile:

編寫makefile需要實作:
(1) 将bank.cpp編譯成靜态庫bank.a/動态庫bank.so;
(2) 将bank.a和bank.so拷貝/opt/lib目錄下;
(3) 将bank.h拷貝到/optinclude目錄下;
(4) 将測試程式檔案test.c編譯成test
makefile檔案内容如下:
MAKE = make -s #指定make的方式
CC = gcc #指定編譯工具
AR = ar -rcv #指定.o檔案打包工具,編譯靜态庫用
RM = /bin/rm -f #指定删除指令
CP = /bin/cp -f #指定拷貝指令
LIBS_INSTALL_DIR = /opt/ #指定目标檔案的最終拷貝的目的目錄
INCLUDE_LIBS = bank1.h #指定編譯時依賴的頭檔案
CPPFLAGS := -I. -fPIC #指定頭檔案所在目錄
LDFLAGS = -lpthread #連結用的庫及所在目錄
SO ?= libbank.so #指定生成的目标檔案,動态庫
A ?= libbank.a #指定生成的目标檔案,靜态庫
TEST ?= test #指定生成的目标檔案,測試程式
LIBS = bank1.o #生成的中間檔案
.PHONY: SO A TEST #聲明SO A TEST為僞規則,這樣即使目标檔案存在的情況下也是會執行對應的生成規則
all : clean $(SO) $(A) $(TEST) #all是整個makefile的入口,它依賴于SO A TEST
$(TEST) : #編譯測試程式test.c檔案
$(CC) $(LIBS) test.c -o $@ $(CPPLIAGS) $(LDFLAGS)
$(SO) : $(LIBS) #編譯生成動态庫
$(CC) -shared -$^ -O $@
$(A) : $(LIBS) #編譯生成靜态庫
$(AR) $@ $(LIBS)
%.o : %.c #将對應的.c檔案編譯成.o檔案
$(CC) -c $< -o $@ $(CPPFLAGS)
clean: #清除
@$(RM) $(SO) $(A) $(TEST) $(LIBS)
install : all #安裝,其實就是将目标檔案拷貝到目的目錄
@$(CP) $(SO) $(A) $(LIBS_INSTALL_DIR)/lib
@$(CP) $(INCLUDE_LIBS) $(LIBS_INSTALL_DIR)/include
uninstall: #解除安裝,其實就是将目标檔案從目的目錄中删除
@$(RM) $(LIBS_INSTALL_DIR)/lib/$(SO) $(LIBS_INSTALL_DIR)/lib/$(A) $(LIBS_INSTALL_DIR)/include/$(INCLUDE_LIBS)
這是将一個目錄下的檔案編譯成庫檔案的makefile,倘若有多個這樣的目錄都要生成庫檔案,其目錄下makefile幾乎是一樣的,不一樣的隻是makefile檔案中開頭定義的那些變量,是以可以将這些一樣的代碼抽取出來放在一個config.mk檔案(config.mk也是一樣makefile檔案)中放在頂層目錄,然後在不同的目錄下的makefile中寫每個目錄獨有的部分,最後包含(include)config.mk檔案,這樣就可以實作多目錄項目的通用makefile了,用到的也是Makefile基礎講到的知識。