make 學習筆記四

2021-07-27 03:05:00 字數 2475 閱讀 9349

make之vpath:

變數「vpath」的定義中,使用空格或者冒號(:)將多個目錄分開。make 搜尋的目錄順序

按照變數「vpath」定義中順序進行(當前目錄永遠是第一搜尋目錄)。

例如:vpath = src:../headers

它指定了兩個搜尋目錄,「src」和「../headers」。對於規則「foo:foo.c」如果「foo.c」在「src」

目錄下,此時此規則等價於「foo:src:/foo.c」

對於第二種來說:當需要為不型別的檔案指定

不同的搜尋目錄時需要這種方式

vpath:關鍵字

它所實現的功能和上一小節提到的「vpath」變數很類似,但是

它更為靈活。它可以為不同型別的檔案(由檔名區分)指定不同的搜尋目錄。它的使用方法有三

種1、vpath pattern directories

為符合模式「pattern」的檔案指定搜尋目錄「directories」。多個目錄使用空格或者

冒號(:)分開。類似上一小節的「vpath」

2、vpath pattern

清除之前為符合模式「pattern」的檔案設定的搜尋路徑

3、vpath

清除所有已被設定的檔案搜尋路徑。

對於vpath的詳細說明待續。

在執行make命令的時候,根據makefile執行步驟,首先讀入所有的makefile檔案,那麼

vpath = include:src       //指定了makefile的搜尋路徑

或者vpath %.h include    //指定.h型別檔案的搜尋路徑是include

vpath %.cpp src      //指定.cpp型別檔案的搜尋路徑是src

這僅僅是對於makefile來說搜尋目標和依賴檔案的路徑,但是對於命令列來說是無效的,也就是說

在執行g++或者gcc時不會自動從vpath 或者vpath中自動搜尋要包含的標頭檔案等資訊檔案

此時要用到了 -i 或者--incude +路徑

例如依賴是:

main.o:main.cpp hello.h

即g++  -c  $<  -iinclude,這時候,g++會自動從include目錄中搜尋要包含的hello.h標頭檔案

makefile 的規則中的目標可以不止乙個,其支援多目標,有可能我們的多個目標同時依賴於乙個檔案,並且其生成的命令大體類似。於是

我們就能把其合併起來。當然,多個目標的生成規則的執行命令是同乙個,這可能會可我們帶來麻煩,不過好在我們的可以使用乙個自動

化變數「$@」(關於自動化變數,將在後面講述),這個變數表示著目前規則中所有的目標的集合,這樣說可能很抽象,還是看乙個例子吧。

bigoutput littleoutput : text.g

generate text.g -$(subst output,,$@) > $@

上述規則等價於:

bigoutput : text.g

generate text.g -big > bigoutput

littleoutput : text.g

generate text.g -little > littleoutput

其中,-$(subst output,,$@)中的「$」表示執行乙個makefile 的函式,函式名為subst,後面的為引數。關於函式,將在後面講述。這裡的這

個函式是擷取字串的意思,「$@」表示目標的集合,就像乙個陣列,「$@」依次取出目標,並執於命令。

make的一些tips:

命令執行:

當依賴目標新於目標時,也就是當規則的目標需要被更新時,make會一條一條的執行其後的命令。需要注意的是,如果你要讓上一條命

令的結果應用在下一條命令時,你應該使用分號分隔這兩條命令。比如你的第一條命令是cd 命令,你希望第二條命令得在cd 之後的基礎上執行,那麼你就不能把這兩條命令寫在兩行上,而應該把這兩條命令寫在一行上,用分號分隔

命令出錯忽視處理:

方法一:

全域性的辦法是,給make 加上「-i」或是「--ignore-errors」引數,那麼,makefile 中所有命令都會忽略錯誤。而如果乙個規則是以

「.ignore」作為目標的,那麼這個規則中的所有命令將會忽略錯誤。

方法二:

make 的引數的是「-k」或是「--keep-going」,這個引數的意思是,如果某規則中的命令出錯了,那麼就終目該規則的執

行,但繼續執行其它規則。

方法三:

在makefile 的命令行前

加乙個減號「-」(在tab 鍵之後),標記為不管命令出不出錯都認為是成功的。如:

clean:

-rm -f *.o

make學習筆記

編寫makefile makefile檔案命令開始不是空格,是tab鍵 make命令會自動查詢當前目錄下名為的makefile的檔案,找到之後會解析makefile檔案,並執行檔案的內容。makefile檔案中的內容 執行make命令 makefile預設只執行第乙個標號,其他標號不執行,若要執行其...

make編譯筆記(四)

函式的呼叫語法 函式名 引數集合 函式名和引數之間用空格隔開,引數之間用,符號 字串處理函式 字串替換函式,把text中的from字元替換成to,返回被替換後的字串 模式字元換替換函式,查詢text中的單詞 以空格 tab 回車 換行分隔 是否符合模式pattern,如果匹配則以replacemen...

make學習筆記(一)

1 由於實際開發中,乙個程式往往是由多個原始檔組成的,所以單用gcc除錯往往是很麻煩的,加上若在除錯過程中只修改了部分原始檔,用gcc命令編譯的話會將連同沒被修改的原始檔一起編譯,這大大地降低了編譯效率,由此引入了make工程管理器。2 make是乙個半自動化的工程管理器,它需要依賴makefile...