關於makefile的那些事兒

2022-08-01 01:48:08 字數 2506 閱讀 9297

最近越來越感覺到,在linux下面身為乙個程式設計師,不會makefile就不是乙個合格的程式設計師,所以今天我們介紹下常用的makefile編寫.

了解知識:

編譯:把高階語言書寫的**轉換為機器可識別的機器指令。編譯高階語言後生成的指令雖然可被機器識別,但是還不能被執行。編譯時,編譯器檢查高階語言的語法、函式與變數的宣告是否正確。只有所有的語法正確、相關變數定義正確編譯器就可以編譯出中間目標檔案。通常,乙個高階語言的原始檔都可對應乙個目標檔案。目標檔案在linux 中預設字尾為".o"(如「 foo.c」的目標檔案為「 foo.o」)。

makefile簡介 :

當使用 make 工具進行編譯時,工程中以下幾種檔案在執行 make 時將會被編譯 (重新編譯):

1. 所有的原始檔沒有被編譯過,則對各個 c 原始檔進行編譯並進行鏈結,生成最後的可執行程式;

2. 每乙個在上次執行 make 之後修改過的 c 源**檔案在本次執行 make 時將會被重新編譯;

3. 標頭檔案在上一次執行 make 之後被修改。則所有包含此標頭檔案的 c 原始檔在本次執行 make 時將會被重新編譯。

後兩種情況是 make 只將修改過的 c 原始檔重新編譯生成.o 檔案,對於沒有修改的檔案不進行任何工作。重新編譯過程中,任何乙個原始檔的修改將產生新的對應的.o檔案,新的.o 檔案將和以前的已經存在、此次沒有重新編譯的.o 檔案重新連線生成最後的可執行程式。

makefile的基本規則:

makefile由一組規則組成,規則如下:

makefile基本規則三要素:

目標:要生成的目標檔案

依賴:目標檔案由哪些檔案生成

命令:通過執行該命令由依賴檔案生成目標

makefile工作原理:

makefile變數:

在makefile中使用變數有點類似於c語言中的巨集定義,使用該變數相當於內容替換, 使用變數可以使makefile易於維護,修改內容變得簡單變數定義及使用。

1).普通變數

foo = abc            // 定義變數並賦值

bar = $(foo)        // 使用變數,$(變數名)

定義了兩個變數:foo、bar,其中bar的值是foo變數值的引用。

變數定義直接用』=』

使用變數值用$(變數名)

2)makefile中也提供了一些變數(變數名大寫)供使用者直接使用,我們可以直接對其進行賦值

src = main.c func1.c func2.c

cc = gcc #arm-linux-gcc

cppflags : c預處理的選項如:-i

cflags: c編譯器的選項–wall –g -c

ldflags : 鏈結器選項–l –l

3)自動變數

$@:表示規則中的目標

$<:>

$^:表示規則中的所有條件,組成乙個列表,以空格隔開,如果這個列表中有重複的項則消除重複項。

注意:自動變數只能在規則的命令中中使用

4)模式規則

至少在規則的目標定義中要包含'%','%'表示乙個或多個,在依賴條件中同樣可以使用'%',依賴條件中的'%'的取值取決於其目標

模式規則示例:

%.o:%.c

$(cc) –c $(cflags) $(cppflags) $< -o $@

makefile函式:

makefile中的函式有很多,在這裡給大家介紹兩個最常用的。

1.    wildcard – 查詢指定目錄下的指定型別的檔案    

src = $(wildcard *.c)//找到當前目錄下所有字尾為.c的檔案,賦值給src

2.    patsubst – 匹配替換

obj = $(patsubst %.c,%.o, $(src)) //把src變數裡所有字尾為.c的檔案替換成.o

注意:在makefile中所有的函式都是有返回值的。

clean:

用途:清除編譯生成的中間.o檔案和最終目標檔案

make clean 如果當前目錄下有同名clean檔案,則不執行clean對應的命令,解決方案:

偽目標宣告: .phony:clean

宣告目標為偽目標之後,makefile將不會該目標是否存在或者該目標是否需要更新

clean命令中的特殊符號:

「-」此條命令出錯,make也會繼續執行後續的命令。如:「-rm main.o」

「@」不顯示命令本身,只顯示結果。如:「@echoclean done」

其它了解內容:

make 預設執行第乙個出現的目標,可通過make dest指定要執行的目標

make -c 指定目錄: 進入指定目錄,呼叫裡面的makefile

make -n :只列印要執行的命令,不會真正執行命令

make -p :顯示隱含規則資料庫中的資訊

make -f :-f執行乙個makefile檔名稱,使用make執行指定的makefile

關於Python那些事兒

1.易於學習 python有相對較少的關鍵字,結構簡單,和乙個明確定義的語法,學習起來更加簡單。2.易於閱讀 python 定義的更清晰。3.易於維護 python的成功在於它的源 是相當容易維護的。4.乙個廣泛的標準庫 python的最大的優勢之一是豐富的庫,跨平台的,在unix,windows和...

關於Nginx那些事兒

記憶體少 併發能力強,效能優化 正向 在瀏覽器中配置 伺服器,實現客戶端對伺服器的訪問。也就是說,在一般情況下,我們客戶端無法直接訪問到伺服器,需要有那麼乙個中臺作為中間應用實現訪問。反向 反向 中,客戶端是無知的,不知道是否配置了伺服器,我們將資料發到反向 伺服器上去,反向 伺服器選擇目標伺服器獲...

關於BOM的那些事兒

window物件 1.window物件是最頂層的物件 2.window物件有六大屬性,這六大屬性本身也是物件 3.window物件旗下的document也是物件 並且document旗下有五大屬性 4.document旗下的五大屬性又是物件,總結 都是物件 window screenleft 和 s...