《跟我一起寫Makefile》學習筆記(八)

2021-09-11 03:45:16 字數 2011 閱讀 8072

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的編輯器,但如果...