makefile檔案編寫總結

2021-08-28 08:37:21 字數 2045 閱讀 8315

最近打算自己編譯乙個android原始碼,放模擬器上跑,發現有幾個難點android整個的架構,執行機制,以及build,而build中最為重要的一些內容就是makefile檔案,shell及pathon指令碼等,只有這些內容掌握了,才可能搞清楚真個android的編譯原理,本文就針對makefile的學習做乙個簡短的總結,總共花了一天時間系統看完。

makefile檔案最為重要的幾個內容點:書寫規則,書寫命令,條件語句,函式,變數使用,模式以及隱含規則。下面就針對以上幾點內容展開介紹。

makefile 裡主要包含了五個東西:顯示規則(書寫規則、命令、條件語句、函式、模式)、隱晦規則、變數定義、檔案指示和注釋。

顯示規則。顯示規則說明了,如何生成乙個或多個的目標檔案。這是由 makefile 的書寫者明顯指出,要生成的檔案,檔案的依賴檔案,生成的命令。

隱晦規則。由於我們的 make 有自動推導的功能,所以隱晦的規則可以讓我們比較粗糙 地簡略地書寫 makefile,這是由 make所支援的。

變數的定義。在 makefile 中我們要定義一系列的變數,變數一般都是字串,這個有 點像 c 語言中的巨集,當 makefile 被執行時,其中的變數都會被擴充套件到相應的引用位置上。

檔案指示。其包括了三個部分,乙個是在乙個 makefile 中引用另乙個 makefile,就 像 c 語言中的 include 一樣;另乙個是指根據某些情況指定 makefile 中的有效部分,就 像 c 語言中的預編譯#if 一樣;還有就是定義乙個多行的命令。

注釋。makefile 中只有行注釋,和 unix 的 shell 指令碼一樣,其注釋是用「#」字元, 這個就像 c/c++中的「//」一樣。如果你要在你的 makefile 中使用「#」字元,可以用反斜槓進行轉義,如:「\#」。

最後,還值得一提的是,在 makefile 中的命令,必須要以[tab]鍵開始。

gnu 的 make 工作時的執行步驟入下:(其它的 make 也是類似)

1、讀入所有的 makefile。

2、讀入被 include 的其它 makefile。

3、初始化檔案中的變數。

4、推導隱晦規則,並分析所有規則。

5、為所有的目標檔案建立依賴關係鏈。

6、根據依賴關係,決定哪些目標要重新生成。

7、執行生成命令。

下面拿乙個例項具體分析:

# 同上面,載入make.defines檔案,該檔案記錄了各個目錄下都要用到的一次額公用變數,如cc,cflags等。

include ../make.defines

# 程式的名稱

progs=demo

# all是偽目標

all:$(progs)

# *.o依賴於*.c,將*.c-->*.o,這裡的*的代表的東西是一致的

%.o: %.c

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

# 下面指示如何生成demo程式

demo: demo.o $(libs)

$(cc) $(cflags) -o $@ demo.o $(libs)

clean:

rm -rf *.o $

include 將上級目錄中的make.defines引入進來,宣告all為偽目標並且依賴demo檔案,作為預設生成目標檔案,偽目標好處是可以一次依賴多個檔案,檔案的生成可以放在下面依次生成;

%.o:%.c表示模式規則,將所有原始檔名稱依次對應到obj檔案的檔名稱,即最後生成的obj檔名(去除字尾)跟原始檔名稱一致。

cc表示編譯器的乙個變數,採用哪種型別編譯器

cflags表示編譯器引數變數

-o表示生成目標檔案

$@表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,「$@」就是匹配於 目標中模式定義的集合。

$《表示依賴目標中的第乙個目標名字。如果依賴目標是以模式(即「%」)定義的,那麼「$<」 將是符合模式的一系列的檔案集。注意,其是乙個乙個取出來的。

clean表示偽目標,由於沒有依賴任何東西,因此需要通過make clean才能完成刪除操作

此makefile檔案最後生成demo可執行檔案

未完待續。。。

makefile檔案編寫

hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...

Makefile檔案編寫

1 基本大全教程 2 四個賦值的區別 是最基本的賦值 是覆蓋之前的值 是如果沒有被賦值過就賦予等號後面的值 是新增等號後面的值其中 和 的區別是 立馬賦值,是整個makefile檔案讀取完後賦值。1 make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile...

Makefile檔案編寫

main3.c 1 include 2 include static lib.h 3 include fun.h 4 5int main void static lib.h和 1 extern int add int a,int b 2 extern int sub int a,int b 3 ex...