Re: [問題] makefile的寫法問題

看板C_and_CPP作者 (「雄辯是銀,沉默是金」)時間12年前 (2013/08/22 00:23), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串2/5 (看更多)
※ 引述《Zoxge (Zoxge)》之銘言: : 標題: [問題] makefile的寫法問題 : 時間: Thu Aug 22 00:24:05 2013 : : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : Linux : : 問題(Question): : makefile有個好處是可以自行判斷檔案有沒有被改過,沒改過就不必重編 : : 但問題來了,當.cpp檔有幾百幾千個,又想要能自行判斷每個檔案是否被改過 : 這樣寫makefile不就xxx.o這樣的target也得要寫幾百幾千個 = = : 請問有比較輕鬆的寫法嗎? : : 謝謝大家 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 123.195.197.207 : 推 Wush978:如: http://0rz.tw/z3GzQ 先例用wildcard建立所有目標 08/22 00:56 : → Wush978:然後下面利用 %.o : %.cpp ,搭配$<(對應到.cpp)和$@(.o) 08/22 00:57 : → Wush978:來撰寫compiling的指令即可。 08/22 00:57 a.o: a.c b.o: b.c 可以用 pattern rule 來解決, 那 ab:a.o b.o gcc -o $@ $^ 這種的有無類似方法來處理? 後面 a.o b.o ... 要一值寫到 z.o 也是要寫不少。 和 .h 的相依性可以用 gcc -MM 來處理 ex: process.c include 很多 .h gcc -Iinclude/ -MM process.c process.o: process.c include/process.h include/type.h include/protect.h \ include/k_string.h include/keyboard.h include/tty.h include/console.h \ include/console.h include/tty.h include/romfs.h include/syscall.h \ include/process.h include/vga.h include/k_assert.h include/k_stdio.h \ include/k_stdio.h include/k_string.h include/k_stdlib.h \ include/systask.h include/vfs.h include/storage.h include/storage.h 進階的作法把這些都合在一起: %.d: %.c set -e; rm -f $@ ; gcc -MM $(CFLAGS) $< > $@.$$$$ ; sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@ ; rm -f $@.$$$$ ref: linux c 編程 一站式學習 p321: http://learn.akae.cn/media/ch22s04.html : 推 johnjohnlin:cmake +1 08/22 01:14 : → vocaloid:gcc也可以幫你生dependency (-M) 08/22 01:25 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.239.46

08/22 08:40, , 1F
可以用變數做一些整理
08/22 08:40, 1F
pcyu16: 可以舉個例子嗎?

08/22 09:01, , 2F
變數存 .c list,然後用 patsubst 產生 .o list
08/22 09:01, 2F
macro substitution? 也是不錯的方法。 1 files = main.aa stack.aa 2 sources = $(files:.aa=.c) 3 4 %.aa:%.zz 5 ls $@ 6 main.zz: 7 ls / 8 clean: 9 echo $(files) 10 echo $(sources) L2 把 main.aa 換成 main.c; stack.aa 換成 stack.c 很怪異的語法, 令我困惑。所以 sources 就是 main.c stack.c 突然發現, 這好像不符合版面 c/c++ 主題。 ※ 編輯: descent 來自: 59.125.239.46 (08/22 09:28)

08/22 15:11, , 3F
我覺得還在fold內吧 畢竟本版常推廣要用project
08/22 15:11, 3F

08/22 15:12, , 4F
那比project更老派的make沒有理由不涵蓋啊 XD
08/22 15:12, 4F
文章代碼(AID): #1I5LeHJn (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1I5LeHJn (C_and_CPP)