初識makefile結構

sun_shine發表於2018-03-04

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依賴示例1

makefile依賴示例2:不使用@符

makefile依賴示例2

makefile依賴示例3:執行特定目標

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
    func.c
  • make示例--main.c
    main.c
  • make示例--makefile與編譯執行結果
    makefile

從編譯執行結果可知:
--第一次執行make命令的時候,編譯器會根據依賴關係呼叫對應的命令,並同時生成目標檔案func.o和main.o,
--第二次或者第三次執行make命令的時候,雖然目標檔案func.o和main.o並沒有做任何更改,但是因為編譯器沒有生成hello.out,故編譯器每次都會執行all命令去生成目標檔案hello.out。

make示例2:將最終可執行檔名hello.out和all同時作為makefile中第一條規則的目標

makefile
從編譯執行結果可知:
當使用最終可執行檔名hello.out和all同時作為makefile中第一條規則的目標的時候,
--第一次執行make命令的時候,編譯器會生成同時目標檔案func.o、main.o、hello.out;
--第二次執行make命令的時候,由於目標檔案hello.out已經存在,故編譯器不會再執行all目標之後的命令。

#小結

  • makefile用於定義原始檔間的依賴關係
  • makefile說明如何編譯各個原始檔並生成可執行檔案
  • makefile中的目標之間存在連續依賴關係
  • 依賴存在並且命令執行成功是目標完成的充要條件

相關文章