1. 程式人生 > >第10課 - 變量與函數的綜合示例

第10課 - 變量與函數的綜合示例

文件夾 mes fix mage 自動 wid bsp == list

第10課 - 變量與函數的綜合示例

1. 實戰需求

  (1)自動生成 target 文件夾存放可執行文件

  (2)自動生成 objs 文件夾存放編譯生成的目標文件(*.o)

  (3)支持調試版本的編譯選項

  (4)考慮代碼的擴展性 ——> 使用變量

2. 工具原料

  — $(wildcard _pattern)

    • 獲取當前工作目錄中滿足_pattern的文件或目錄列表

  — $(addprefix _prefix, _names)

    • 給名字列表_names中的每一個名字增加前綴_prefix

3. 關鍵技巧

  — 自動獲取當前目錄下的源文件列表(函數調用

    • SRCS := $(wildcard *.c)  

  — 根據源文件列表生成目標文件列表(變量的值替換

    • OBJS := $(SRCS:.c=.o)  

  — 對每一個目標文件列表加上路徑前綴(函數調用

    • OBJS := $(addprefix path/, $(OBJS))

4. 規則中的模式替換(目錄結構)

  — $(OBJS) : %.o : %.c 形式的模式替換對象是$(OBJS)對應的目標列表

技術分享

  — %.o : %.c 形式的模式替換對象是當前工作目錄

技術分享

5. 編譯規則的依賴

技術分享

  首先創建 objs 和 target 文件夾分別用來存放 .o 中間文件和可執行程序,然後創建 .o 中間文件和可執行程序,需要在前面添加前綴(放入前面創建的目錄中)。

  根據$(DIRS) 、 $(OBJS)兩個依賴創建文件夾和相應的 .o 文件。後面再由模式匹配生成 .o 文件。

  (自上而下的一種委派)

 1 # 考慮代碼的擴展性
 2 CC := gcc
 3 MKDIR := mkdir
 4 RM := rm -rf
 5 
 6 # 存放可執行程序和中間文件的文件夾
 7 DIR_OBJS := objs
 8 DIR_TARGET := target
 9 
10 DIRS := $(DIR_OBJS) $(DIR_TARGET)
11 
12 # 可執行程序
13 TARGET := $(DIR_TARGET)/hello-makefile
14 15 # .o中間文件 16 SRCS := $(wildcard *.c) 17 OBJS := $(SRCS:.c=.o) 18 OBJS := $(addprefix $(DIR_OBJS)/, $(OBJS)) 19 20 .PHONY : rebuild clean all 21 22 $(TARGET) : $(DIRS) $(OBJS) 23 $(CC) -o $@ $(OBJS) 24 @echo "Target File ==> $@" 25 26 $(DIRS) : 27 $(MKDIR) $@ 28 29 # 增加debug選項-g 30 $(DIR_OBJS)/%.o : %.c 31 ifeq ($(DEBUG),true) 32 $(CC) -o $@ -c -g $^ 33 else 34 $(CC) -c -o $@ $^ 35 endif 36 37 rebuild : clean all 38 39 all : $(TARGET) 40 41 clean : 42 $(RM) $(DIRS) 43

6. 小結

  — 目錄可以成為目標的依賴,在規則中創建目錄

  — 預定義函數是makefile實戰時不可或缺的部分

  — 規則中的模式匹配可以直接針對目錄中的文件

  — 可以使用命令行變量編譯特殊的目標版本

註:本文整理於《狄泰12月提升計劃》課程內容     

第10課 - 變量與函數的綜合示例