Mar/13/2014已更正錯誤:原本錯誤分析請看這邊
之前分享了Makefile header file dependency問題解決方式之一,裏面提到把.o 和.d 指定產生到特定目錄,而不是散落各處的改進方向。過了幾天網路上看到別人的解法,手癢自己也來玩一下。
範例程式細節在這邊,不想看code只要知道每個檔案都有參考到某個自訂的header file就好了。
這次加碼一下,把檔案散落在不同目錄如下
1 2 3 4 5 6 7 8 9 10 | |
Makefile更改如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
整個Makefile主要是
- 找出所有要編譯的c檔案並放在變數
SRCS - 把變數
SRC中的.c換成.o並存到變數OBJS - 再把變數
OBJS裏面的字串每一個都加上build/的prefix並存到變數OUT_OBJS - 再把
OUT_OBJS中的.o換成.d並存到變數DEP - 編譯.c到.o的時候,先產生對應於C code的目錄並將.o .d存到裏面
參數說明如下
-MMD請參考這邊shell請參考這邊patsubst請參考這邊addprefix,照字面就是加上prefixdir,取得檔案的dir$@- Makefile的內建巨集,代表target
$<- Makefile的內建巨集,代表第一個prerequisite
-*告訴make 忽略失敗%.o:%.c- Pattern Rules
- %表示萬用字元,而prerequisite的%會和target的% match到的相同。所以就是說所有.o結尾的檔案depends on .c檔案時要做下面的事
- 舉例來說
$(OUT_DIR)/%.o:%.c,表示build/xxx/file1.o 會依賴對應到的xxx/file1.c
- 其實重點是
mkdir -p $(dir $@)會自動在build產生對應的目錄存放.d和.o
跑起來結果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |