makefile的寫法問題 - Linux

Table of Contents

※ 引述《Zoxge (Zoxge)》之銘言:
: 如果有很多個.cpp檔
: 就必須要有每個.cpp對應的target
: 但問題來了,當.cpp檔有幾百幾千個,又想要能自行判斷每個檔案是否被改過
: 這樣寫makefile不就xxx.o這樣的target也得要寫幾百幾千個 = =
: 請問有比較輕鬆的寫法嗎?
: 謝謝大家

給你我的 makefile 架構原形範例,
拿去對照查書理解一下內容,也許你會找到比我更好的寫法。

使用方法是,將你的 .cpp 檔案列表,照這個格式放進原始碼串列中,
如果 .cpp 有引入 .h 檔案,這個 makefile 也會一併幫你檢查 .h。

# 檔案開始

# .cpp 原始碼檔案名稱串列
SOURCE_CPP_FILES =\
./Tools/tools.cpp\
./Modules/modules.cpp\
./main.cpp

# .cpp 目的碼檔案名稱串列
OUTPUT_OBJECT_OF_CPP_FILES = $(SOURCE_CPP_FILES:.cpp=.o)

# .cpp 相依性規則輸出檔案名稱串列
OUTPUT_DEPENDENCY_RULE_OF_CPP_FILES = $(SOURCE_CPP_FILES:.cpp=.dep)

# 總輸出目的碼資源檔案名稱串列
ALL_OBJECT_FILES = $(OUTPUT_OBJECT_OF_CPP_FILES)

# ---------- 目標檔案巨集定義 ----------
# 目標檔檔案名稱
ALL_TARGET = ./MyTarget

# ---------- 主要 make 規則 ----------
all: $(ALL_TARGET)

# ---------- 目的碼檔案 make 規則 ----------
objects: $(ALL_OBJECT_FILES)

# ---------- 目的碼檔案以及目標檔案 clean 規則 ----------
clean: cleantarget cleanobjects cleandep

# ---------- 目標檔案 clean 規則 ----------
cleantarget:
rm -f $(ALL_TARGET)

# ---------- 目的碼檔案 clean 規則 ----------
cleanobjects:
rm -f $(ALL_OBJECT_FILES)

# ---------- 相依性規則檔案 clean 規則 ----------
cleandep:
rm -f $(OUTPUT_DEPENDENCY_RULE_OF_CPP_FILES)

# ---------- 連結目的碼檔案產生目標 ----------
$(ALL_TARGET): $(ALL_OBJECT_FILES)
g++ -o $@ $(ALL_OBJECT_FILES)

# ---------- .cpp 原始碼檔案相依性規則之建造規則 ----------
%.dep: %.cpp
g++ -MM $< -MT $*.o > $@

# ---------- 編譯 .cpp 原始碼檔案產生目的碼檔 ----------
%.o: %.cpp
g++ -c -o $@ $<

# ---------- 載入建造好的相依性規則 ----------
-include $(OUTPUT_DEPENDENCY_RULE_OF_CPP_FILES)

# 檔案結束

沒錯,很空洞,這只是個架構,將你自己相關的編譯參數,代入修改一下吧。
重點是你一定要去好好理解一下使用萬用字元與隱含目標的好處。

當然,如果真的原始碼列表真的數量驚人,那就得靠外部方式處理,這再舉個例子,
去改寫一下 makefile,將開頭的 SOURCE_CPP_FILES 巨集定義清除,換成:

-include MySource.lst

然後,下指令:

echo "SOURCE_CPP_FILES =\\" > MySource.lst;\
find ./ -name "*.cpp" | awk '{ print $1"\\" }' >> MySource.lst

(指令只是拋磚引玉,列表最後一個檔案名稱結尾會多個 \ 符號,
留給你自己研究怎樣方便清除嘍)



--

All Comments

Aaliyah avatarAaliyah2013-08-25
感謝您
照您的模板去做就成功了
但請問 %.dep: %.cpp 這一項是做什麼用呢?
Yedda avatarYedda2013-08-29
另外,這樣的寫法不會檢查.h檔是否被改過,請問要怎麼做呢?
Todd Johnson avatarTodd Johnson2013-09-02
發現make clean做第二次,%.dep: %.cpp也會再跑一次 好怪@@
Frederica avatarFrederica2013-09-05
是因為 -include $(OUTPUT_DEPENDENCY_RULE_OF_CPP_FILES)的
Charlie avatarCharlie2013-09-05
關係,但不include這個好像也沒關係耶?
Edith avatarEdith2013-09-10
如果確定資料夾底下所有檔案都要編,也可用wildcard吧