1. 程式人生 > 其它 >makefile編譯多目錄檔案 自動生成編譯目錄

makefile編譯多目錄檔案 自動生成編譯目錄

技術標籤:linux程式人生

makefile編譯多目錄檔案 自動生成編譯目錄


這段時間學習了makefile和gcc的一些用法,感受到了makefile的強大,在實踐過程中,深刻體會到,要想寫出一個號的make框架,不僅僅是要了解makefile規則,還要熟悉gcc和shell,這些東西在makefile中各種穿插,對初學者來說,往往一頭霧水,看著看著別人的例子就不知道怎麼理解下去,但是還是要耐心的去抽絲剝繭,最終才能恍然大悟。
下面的這個makefile,雖然網路上這種例子很多,但這是根據自己理解寫成的,也算是對這段時間學習的一個總結。主要完成了下面幾點功能:

  1. 自動化搜尋原始檔目錄;
  2. 目標檔案和編譯中介軟體檔案儲存到指定檔案統一管理;
  3. 使用自動化變數自動編譯;
  4. 使用shell建立build目錄;
  5. 使用makefile函式進行文字處理。

目錄結構如下:
在這裡插入圖片描述
makefile

#獲取當前工作路徑
TOP_DIR:=$(CURDIR)
#設定目標名
Target:=hello
#設定原始檔目錄
SRC_PATH:=$(TOP_DIR) $(TOP_DIR)/other
#設定編譯目錄
BUILD_PATH:=$(TOP_DIR)/build
#設定編譯臨時目錄
OBJ_PATH:=$(BUILD_PATH)/temp
#設定編譯最終檔案目錄
BIN_PATH:=$(BUILD_PATH)/bin
#獲取原始檔目錄下所有c檔案列表
SRC:=$(foreach dir,$(SRC_PATH),$(wildcard $(dir)/*.c))
#去掉c檔案目錄
SRC_WITHOUT_DIR:=$(notdir $(SRC))
#生成.o檔案列表
OBJ_WITHOUT_DIR:=$(patsubst %.c,%.o,$(SRC_WITHOUT_DIR))
#為.o檔案列表加上編譯目錄
OBJ_WITH_BUILD_DIR:=$(addprefix $(OBJ_PATH)/,$(OBJ_WITHOUT_DIR))
$(info "OBJ_WITH_BUILD_DIR:$(OBJ_WITH_BUILD_DIR)")
#新增標頭檔案目錄
CFLAGS=$(addprefix -I,$(SRC_PATH))
#為gcc新增原始檔搜尋目錄
VPATH=$(SRC_PATH)
#編譯目標
all:build_prepare $(Target)
#連線目標
$(Target):$(OBJ_WITH_BUILD_DIR) 
	cc -o $(BIN_PATH)/
[email protected]
$^ #編譯生成.o檔案 $(OBJ_PATH)/%.o:%.c cc -c $(CFLAGS) -o [email protected] $< #建立編譯目錄 build_prepare: @if [ ! -d $(BUILD_PATH) ]; then \ mkdir -p $(OBJ_PATH); \ mkdir -p $(BIN_PATH); \ fi .PHONY:clean clean: -rm -rf $(BIN_PATH)/$(Target) $(OBJ_WITH_BUILD_DIR)