天天看點

編寫簡單通用makefile

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

編寫簡單通用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基礎講到的知識。