Makefile文件语法规则及用法总结
一、Makefile的作用
Makefile文件實質上就是一個工程代碼編譯腳本,一旦寫好,只需要一個make命令,整個工程就會自動按照腳本的規定方式編譯,極大的提高了軟件開發的效率。
? ? ?make是系統指令,它是根據自己的配置文件,可以進行工程管理的指令。文件放在目錄,要編譯哪個目錄的文件,要鏈接哪個目錄的文件....
?? ?
?? ?makefile是make指令對應的一個配置,當輸入make回車時,執行makefile里面的所有配置指令,一一執行。
?? ?makefile的組成:makefile的語法+shell指令。(任何linux里面用到的shell指令都可以加入進去)
二、make 命令使用
三、makefile的編寫規則
?? ?基本語法如下:
?? ?目標文件:依賴文件
?? ?(tab)執行指令集合
?? ?工作原理:(修改時間比較的原理)
?? ??? ?1.識別目標文件,去找到他的依賴文件(如果找得到)
?? ??? ?2.執行情況
?? ??? ??? ?(1)如果發現目標文件不存在,同時依賴文件存在,就會執行指令集合。
?? ??? ??? ?(2)如果發現目標文件已經存在了,同時依賴問價存在,make指令會自動去比較兩者的修改時間
?? ??? ??? ??? ??? ?修改時間:依賴文件 > 目標文件,就會執行指令集合。
?? ??? ??? ??? ??? ?修改時間:依賴文件 <= 目標文件,就不會執行指令集合。同時會提示目標文件已經是最新的
? ? ?
?? ??? ?注意點:makefile之后從第一個規則體的依賴文件去操作,只會操作出現的依賴文件.? ?
?? ??? ?最常用的規則:(多個.c生成一個可執行文件)
?? ??? ?目標文件(最終目標):依賴文件(n個)
?? ??? ??? ?執行指令
?? ??? ?目標文件(依賴文件(n個)):依賴文件
?? ??? ??? ?執行指令
四、偽指令
? ? ? ? all? 跟? make+目標文件
?? ??? ?all表示最終目標,后來的依賴文件就可以寫可執行文件,不需要寫指令。
?? ??? ?如果在all后面的依賴文件沒有出現clean,但是你寫了clean。那么makefile是不會自動執行clean,只有當單獨輸入make clean時,才會獨立執行clean執行指令。
? ? ? ? 在許多Makefile中都可以看到.PHONY:xxx之類的語句,其含義就是定義xxx為偽目標,當一個目標被聲明為偽目標后,make在執行規則時不會去試圖去查找隱含規則來創建它。
? ? ? ???可近似的理解為編譯可選項:等用戶想操作的時候才執行,用戶不操作,不會自動執行。
參考博客:?https://www.cnblogs.com/samuelwnb/p/3895191.html
五、makefile中的變量
?? ??? ?實際上變量只能存儲字符串。
?? ??? ?定義:變量名 = “字符串”
?? ??? ?使用:$(變量名)
?? ??? ?賦值方式:
?? ??? ??? ?直接對變量本身進行操作
?? ??? ??? ? =?? ?遞歸展開賦值,當對一個變量進行操作時,如果這個變量后后面有變化,這個變量不會馬上賦值,會一直找到最后一次變量,再進行賦值。
?? ??? ??? ?:=?? ?就地展開賦值,當對一個變量進行操作,直接使用這個變量當前的值,而不受后面任何變量。
?? ??? ??? ?
?? ??? ??? ?在變量的基礎上加上東西
?? ??? ??? ?+=?? ?對某個變量的值,進行追加
?? ??? ??? ??=?? ?如果變量沒有初始化,則對其初始化
六、自動變量
?? ?所有自動變量,自己本身存在的特定的作用。
?? ?$*?? ?不包含拓展名的目標文件名稱。
?? ?$+?? ?所有的依賴文件名稱,但是可能出現同名的。
?? ?$^?? ?所有的依賴文件名稱,但是不會出現同名的。
?? ?$< ?第一個依賴文件的名稱。
?? ?$@?? ?目標文件的完整名稱
?? ?$??? ?所有已經更新的依賴文件的名字。(比目標文件要新的依賴文件)
?? ??? ?
?? ?模式規則:(%),只要在文件中,出現%符號,那就代表是模式規則。等效于shell指令的*通配符。
?? ?自動根據目標文件,去配對對應的依賴文件。自動順序的配對
七、makefile的函數
?? ?makefile內部是允許自定義函數/使用函數。
?? ?函數的用法:
?? ??? ?$(函數名 函數參數列表)
?? ??? ?wildcard:文件名展開函數。將所有用戶想要找到的文件名給得到(用戶想要得到的文件名可以通過通配符)。
?? ??? ?用法:$(wildcard 可變參數列表)?
?? ??? ??? ??? ?返回值:已經找到的文件名列表,每個文件名都加上空格。
?? ??? ?$(wildcard *.c)
?? ??? ?
?? ??? ?patsubst:替換字符串輸出。按照用戶指定的替換方式,對相應的字符串進行替換。
?? ??? ?用法:$(patsubst <form>,<to>,<text>)
?? ??? ??? ??? ?test:要進行替換的原始數據,字符串123s1df32asf5 ?123%
?? ??? ??? ??? ?根據form里面格式的定義,替換稱為to里面的格式。
?? ??? ??? ? $(patsubst %.c,%.o,"1.c 2.c ")
八、通用Makefile框架,適用于一般中小型項目
TARGET := ../bin/main CC := gccINCLUDE:= -I ../includeLIBS:= -lpthreadCSRCS := $(wildcard *.c) OBJS := $(patsubst %.c, %.o, $(CSRCS))$(TARGET): $(OBJS) $(CC) $+ -o $@ $(LIBS) %.o:%.c$(CC) -c -g $< -o $@ $(INCLUDE)clean:rm -rf $(OBJS) $(TARGET)#rm *.o九、庫依賴順序
當一個工程鏈接的庫較多時,很多時候因為庫之間的依賴問題導致一直編譯不過。此時要捋清庫之間的依賴關系,然后按依賴順序(越底層的庫越往后放)鏈接即可。
順序應該如下:
LIBS :=? -l(應用層lib) -l(基礎lib) -l(系統lib)
查看庫依賴關系的命令有為:
# readelf -d [庫名]
# ldd [庫名]
十、Makefile調用shell命令
Makefile腳本中,是可以直接調用shell命令的,并且在執行make時,能看到執行的shell語句。
在shell命令前添加:'@' 符號, 則可以不顯示命令本身而只顯示結果。
在shell命令前添加: '-'? 符號,則運行該條shell命令失敗時,不會中斷Makefile腳本的后續執行。
總結
以上是生活随笔為你收集整理的Makefile文件语法规则及用法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: S5PV210-uboot源码分析-第二
- 下一篇: 多线程下的IO操作