close

敬告遊客:
以下內容枯燥無聊,若情非得已不建議進入。
若仍執意進入,當有頭暈嘔吐現象時請盡速離開本篇文章。


轉載來源自<工程是碎碎念>:http://blog.yam.com/ytha/article/16681234
引用內容如下:

好的, 我們現在進入Makefile的最後部份:

我們現在擁有個檔案叫做 clean.c, hello.c, hello.o及Makefile檔, 其內容如下

all:hello.c
gcc -c hello.c -o hello.o
gcc hello.c -o hello
clean:
rm -f hello.o

此時當我們執行make clean時就會發現, 啥都沒動, hello.o沒有被刪除, 因為make檔一執行就會先去找檔案, 沒有檔案時才會執行其它必要條件, 所以 make clean 認為clean檔案已是存在的所以不會執行 rm -f hello.o

那怎麼辦呢?
只要多加上一行命令就行了:

.PHONY:clean
all:hello.c
gcc -c hello.c -o hello.o
gcc hello.c -o hello
clean:
rm -f hello.o

這樣make就不會把clean看成檔案, 所以會無條件執行了

好了, 現在來說內隱規則(Implicit Rules)
來個Makefile檔簡單的例子(我們現有hello.c及a.h兩個檔),

.PHONY:clean

hello:hello.o
gcc $< -o $@

%.o:%.c a.h
gcc -c $< -o $@

clean:
rm -fr hello.o
rm -fr hello

符號是挺嚇人的~ 目前在說明這些的網上書上資料都寫的很"工程", 所以小弟在此用最白話的方式來說明(保證一看就懂):
% 表示所相對於後面必要條件的檔名的意思, 也就是所謂的樣式規格(pattern rule), hello.o就會去找hello.c, hello.o就會去找hello.c, 第一行前面說過了, 再來, gcc $< 指將指的是hello.o, 而$@只的就是hello, 所以一開始我們沒有hello.o, 就會往下找到 %.o:%c a.h, 可以把這行看成: hello.o: hello.c a.h, 而下一行, $<指的就是hello.c及a.h, $@指的就是hello.o, 這樣是不是很清礎了~?

當然也有舊式的suffix規則, 這種方法有其限制性, 只能應用在副檔名的規則:
.SUFFIXES: <<--這是指先清除suffixes
.SUFFIXES: .o.c <<--這是指將.c檔編譯成.o檔
.SUFFIXES: .c.a <<--這是指將.c檔編譯程.a檔(之前的文章已介紹過)

這樣瞭解了嗎? 小弟部落格自己寫的文章僅是分享, 沒有任何版權, 如果覺得還有那麼點用處, 可以拿去自用或分享給第三者, 但不代表可以拿去營利 ~謝謝~ 請發揚分享的精神~才不會讓您大腦打死結~

arrow
arrow
    全站熱搜

    calories 發表在 痞客邦 留言(0) 人氣()