Re: [問題] makefile的寫法問題
※ 引述《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
(指令只是拋磚引玉,列表最後一個檔案名稱結尾會多個 \ 符號,
留給你自己研究怎樣方便清除嘍)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.240.167.99
※ 編輯: SeamusBerloz 來自: 123.240.167.99 (08/23 02:05)
※ SeamusBerloz:轉錄至看板 C_and_CPP 08/23 13:59
→
08/24 09:22, , 1F
08/24 09:22, 1F
→
08/24 09:22, , 2F
08/24 09:22, 2F
→
08/24 09:22, , 3F
08/24 09:22, 3F
→
08/24 09:23, , 4F
08/24 09:23, 4F
→
08/24 10:14, , 5F
08/24 10:14, 5F
→
08/24 10:22, , 6F
08/24 10:22, 6F
→
08/24 10:23, , 7F
08/24 10:23, 7F
→
08/28 08:44, , 8F
08/28 08:44, 8F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):