makefile的寫法問題 - Linux

By Delia
at 2013-08-23T01:54
at 2013-08-23T01:54
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
(指令只是拋磚引玉,列表最後一個檔案名稱結尾會多個 \ 符號,
留給你自己研究怎樣方便清除嘍)
--
: 如果有很多個.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
(指令只是拋磚引玉,列表最後一個檔案名稱結尾會多個 \ 符號,
留給你自己研究怎樣方便清除嘍)
--
Tags:
Linux
All Comments

By Aaliyah
at 2013-08-25T22:10
at 2013-08-25T22:10

By Yedda
at 2013-08-29T14:20
at 2013-08-29T14:20

By Todd Johnson
at 2013-09-02T14:58
at 2013-09-02T14:58

By Frederica
at 2013-09-05T02:34
at 2013-09-05T02:34

By Charlie
at 2013-09-05T07:13
at 2013-09-05T07:13

By Edith
at 2013-09-10T02:28
at 2013-09-10T02:28
Related Posts
關於SAMBA速度的問題

By Odelette
at 2013-08-22T22:08
at 2013-08-22T22:08
系統備份及使用serial登入

By Hardy
at 2013-08-22T19:38
at 2013-08-22T19:38
能否nohup的程式重新顯示在terminal上

By Ina
at 2013-08-22T16:12
at 2013-08-22T16:12
運行windows硬體

By Hedy
at 2013-08-22T13:40
at 2013-08-22T13:40
ubuntu12.04無法進入圖形介面

By Joseph
at 2013-08-22T10:59
at 2013-08-22T10:59