makefile的意義
- makefile通過特定的語法定義原始檔之間的依賴關係
- makefile說明如何編譯各個原始檔並生成可執行檔案
#依賴的定義:
targets:prerequisites;command1
'\t'command2
複製程式碼
makefile中的元素含義
- targets(目標)
--通常是需要生成的目標檔名
--make所需執行的命令名稱 - prerequisites(依賴條件,可以省略)
--當前目標所依賴的其它目標或檔案 - command(命令)
--完成目標所需要執行的命令
規則中的注意事項
- targets可以包含多個目標 --使用空格對多個目標名進行分割
- prerequisites可以包含多個依賴 --使用空格對多個依賴進行分割
- [Tab]鍵:'\t'
--每一個命令列必須以[Tab]字元開始 --[Tab]字元告訴make此行是一個命令列 - 續行符:
--可以將內容分開寫到下一行,提高可讀性
##makefile依賴示例:
all:test
echo "make all"
test:
echo "make test"
複製程式碼
目標all依賴於test,當執行all的時候,執行過程為:先執行test依賴與命令,然後執行all內部的命令
依賴規則
- 當目標對應的檔案不存在,執行對應命令
- 當依賴在時間上比目標更新,執行對應命令
- 當依賴關係連續發生時,對比依賴鏈上的每一個目標
小技巧
makefile中可以在命令前加上@符,作用為命令無回顯。
makefile依賴規則
- 使用@符後,將不再列印命令語句,而是直接執行命令語句的內容
- all依賴於test,故先執行test依賴與命令,然後才會執行all命令
makefile依賴示例1:使用@符
makefile依賴示例2:不使用@符
makefile依賴示例3:執行特定目標
第一個使用make的編譯示例
hello.out:main.o func.o
gcc -o hello.out main.o func.o
mail.o:main.c
gcc -o main.o -c main.c
func.o:func.c
gcc -o func.o -c func.c
複製程式碼
示例中的依賴關係如下:
- hello.out依賴於main.o和func.o
- main.o依賴於main.c
- func.o依賴於func.c
小技巧
工程開發中可以將最終可執行檔名和all同時作為makefile中第一條規則的目標。
hello.out all:main.o func.o
gcc -o hello.out main.o func.o
複製程式碼
make示例1:僅將all作為makefile中第一條規則的目標
- make示例--func.c
- make示例--main.c
- make示例--makefile與編譯執行結果
從編譯執行結果可知:
--第一次執行make命令的時候,編譯器會根據依賴關係呼叫對應的命令,並同時生成目標檔案func.o和main.o,
--第二次或者第三次執行make命令的時候,雖然目標檔案func.o和main.o並沒有做任何更改,但是因為編譯器沒有生成hello.out,故編譯器每次都會執行all命令去生成目標檔案hello.out。
make示例2:將最終可執行檔名hello.out和all同時作為makefile中第一條規則的目標
從編譯執行結果可知:當使用最終可執行檔名hello.out和all同時作為makefile中第一條規則的目標的時候,
--第一次執行make命令的時候,編譯器會生成同時目標檔案func.o、main.o、hello.out;
--第二次執行make命令的時候,由於目標檔案hello.out已經存在,故編譯器不會再執行all目標之後的命令。
#小結
- makefile用於定義原始檔間的依賴關係
- makefile說明如何編譯各個原始檔並生成可執行檔案
- makefile中的目標之間存在連續依賴關係
- 依賴存在並且命令執行成功是目標完成的充要條件