最近越來越感覺到,在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...