參考資料:正點原子linux驅動開發指南
在正文開始之前舉一個例子方便理解
如上所示,有3個C文件,2個h文件,位於同一目錄下,當在ubuntu中不使用Makefile編譯的時候,輸入的指令爲
gcc main.c calcu.c input.c -o main
爲什麼使用Makefile就不想解釋了,就是因爲方便、好用唄
在書寫Makefile的時候,在同一目錄下建立Makefile文件,要注意首字母是大寫。。
在Makefile中的寫入:
然後輸入make就可以編譯了
輸入make clean可以將所有的.o文件以及main目標文件刪除
注:在運行make和make clean的過程中可能會出現小問題,百度都可以解決
Makefile語法
1. Makefile規則格式
目標…… : 依賴文件集合……
命令 1
命令 2
……
命令列表中的每行命令必須以TAB鍵開始,不能使用空格
2.Makefile變量
Makefile 中的變量都是字符串!類似 C 語言中的宏
賦值符"=", “:=”, “?=”
三者的區別是:
使用“=”時,可以使用後面定義的值
輸入make print輸出:
這裏的解釋是:前面雖然定義了name的值爲zzk,但是也可以使用後面定義的name = liang輸出。
使用“:=”時,不使用後面定義的值
輸入make print輸出:
儘管後面重新定義了一次name的值,但是還是輸出前面的zzk
使用“?=”時
currname ?= liang
這句代碼的意思是如果變量前面沒有被賦值,那麼currname的值就是liang,如果賦值了就是前面的值
註釋和引用
在Makefile中,註釋使用的是#
變量引用的方法是$(變量名)
objects = main.o input.o calcu.o
main: $(objects)
cc -o main $(objects)
這裏使用object代指 main.o input.o calcu.o三個值
3.Makefile模式規則
在前面我們編寫了一個這樣子的Makefile文件來編譯工程
但是第3句到第8句總覺得有點重複,那麼使用一條怎樣的規則,將所有的.c文件,編譯成對應的.o文件呢???
使用的是“%”,“%”表示長度任意的非空字符串,如果要表示所有以.c結尾的文件,可以寫成"%.c",相當於是一個通配符,“a.%c.c”,表示的是以a.開頭以.c結尾的所有文件。
所以main.o:main.c, input.o:input.c, calcu.o:calcu.c可以統一寫成%.o:%.c
4.Makefile自動化變量
通過一行命令來從不同的依賴文件中生成對應的目標?自動化變量就是完成這個功能的!所謂自動化變量就是這種變量會把模式中所定義的一系列的文件自動的挨個取出,直至所有的符合模式的文件都取完,自動化變量只出現在規則的命令中。
常用的只有$ @、$ <、$ ^
使用自動化變量之後的Makefile就變成了下面這樣
5.Makefile僞目標
使用僞目標的主要是爲了避免 Makefile 中定義的只執行命令的目標和工作目錄下的實際文
件出現名字衝突。
在Makefile中插入.PHONY:clean
聲明 clean 爲僞目標以後不管當前目錄下是否存在名
爲“clean”的文件,輸入“make clean”的話規則後面的 rm 命令都會執行。
makefile的知識點還有很多,我常有的就這些吧