1.隱含規則
「隱含規則」也就是一種慣例,make會按照這種「慣例」心照不喧地來執行,那怕我們的makefile中沒有書寫這樣的規則
2.使用隱含規則
要使用隱含規則生成你需要的目標,你所需要做的就是不要寫出這個目標的規則,make會在自己的「隱含規則」庫中尋找可以用的規則,如果找到,那麼就會使用。如果找不到,那麼就會報錯。
如果我們寫了自己的規則,那麼make就不會自動推導並呼叫隱含規則,它會按照我們寫好的規則忠實地執行
3.隱含規則一覽
1)、編譯c程式的隱含規則。
「;.o」的目標的依賴目標會自動推導為「;.c」,並且其生成命令是「$(cc) –c $(cppflags) $(cflags)」
2)、編譯c++程式的隱含規則。
「;.o」的目標的依賴目標會自動推導為「;.cc」或是「;.c」,並且其生成命令是 「$(cxx) –c $(cppflags) $(cflags)」。(建議使用「.cc」作為c++原始檔的字尾,而不是「.c」)..
.7)、彙編和彙編預處理的隱含規則。
「;.o」 的目標的依賴目標會自動推導為「;.s」,預設使用編譯品「as」,並且其生成命令是:「$ (as) (as
flag
s)」。
「<
n>;.
s」的目
標的依賴
目標會自
動推導為
「<
n>;.
s」,默
認使用c
預編譯器
「cpp
」,並且
其生成命
令是:「
(asflags)」。「;.s」 的目標的依賴目標會自動推導為「;.s」,預設使用c預編譯器 「cpp」,並且其生成命令是:「
(asfla
gs)」
。「<
n>;.
s」的目
標的依賴
目標會自
動推導為
「<
n>;.
s」,默
認使用c
預編譯器
「cpp
」,並且
其生成命
令是:「
(as) $(asflags)」。
8)、鏈結object檔案的隱含規則。
「;」目標依賴於「;.o」,通過執行c的編譯器來執行鏈結程式生成(一般是「ld」),其生成命令是: 「$(cc) $(ldflags) ;.o $(loadlibes) $(ldlibs)」。這個規則對於只有乙個原始檔的工程有效,同時也對多個object檔案(由不同的原始檔生成)的也有效。..
.4.隱含規則使用的變數
1).關於命令的變數
ar,as,cc…
2).關於命令引數的變數
arflags,asflags,cflags…
5.定義模式規則
1).你可以使用模式規則來定義乙個隱含規則
語法:
%.o : %.c ; ;
示例
%.o : %.c
$(cc) -c $(cflags) $(cppflags) $< -o $@
2).自動化變數
3).過載內建隱含規則
例如你可以重新構造和內建隱含規則不同的命令,如:
%.o : %.c
$(cc) -c $(cppflags) $(cflags) -d$(date)
你可以取消內建的隱含規則,只要不在後面寫命令就行。如:
%.o : %.s
6.老式風格的"字尾規則"
如".c.o"相當於"%o : %c"
如".c"相當於"% : %.c"
.c.o:
$(cc) -c $(cflags) $(cppflags) -o $@ $<
跟我一起寫 Makefile
概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...
跟我一起寫 Makefile
概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果你想成為乙個專業人士,你還是要了解h...
跟我一起寫 Makefile
跟我一起寫 makefile 陳皓 概述 什麼是makefile?或許很多winodws的程式設計師都不知道這個東西,因為那些windows的ide都為你做了這個工作,但我覺得要作乙個好的和professional的程式設計師,makefile還是要懂。這就好像現在有這麼多的html的編輯器,但如果...