天天看點

淺談Linux下Makefile編寫淺談Linux下Makefile的編寫

淺談Linux下Makefile的編寫

前言:本文簡要介紹Makefile檔案的編寫規範,結合具體項目中的應用進行講解。

具體代碼位址: https://github.com/AnSwErYWJ/DogFood/blob/master/Makefile

簡介

Make工具最主要也是最基本的功能就是通過makefile檔案來描述源程式之間的互相關系并自動維護編譯工作。而makefile 檔案需要按照某種文法進行編寫,檔案中需要說明如何編譯各個源檔案并連接配接生成可執行檔案,并要求定義源檔案之間的依賴關系。

make指令的選項與參數

-k:發生錯誤時任然繼續執行,而不是在檢測到第一個錯誤時停止。
-n:隻輸出要執行的步驟,不真正執行。
-f <filename>:告訴make指令哪個檔案作為makefile檔案。如果不存在就查找makefile檔案,如果還不存在就查找Makefile。按慣例使用Makefile。
           

文法

makefile檔案由一組依賴關系和規則組成。每個依賴關系由一個目标(即将要建立的檔案)和一組該目标所依賴的源檔案組成。

依賴關系

依賴關系定義了最終應用程式裡的每個檔案與源檔案之間的關系。

a.out: main.o
main.o: main.c main.h
           

上面兩行就是依賴關系:目标a.out:依賴于main.o,目标main.o依賴于main.c和main.h。是以,如果main.c和main.h發生更改,則需要重新編譯整個程式。

如果需要一次建立多個目标檔案,則使用為目标all:

注意:如果未指定一個all目标,則make指令隻建立makefile檔案的第一個目标。

規則

規則定義了目标的建立方式。

注意:規則所在行必須以制表符tab開頭。

下面就是一個簡單的例子:

a.out: main.o
    gcc main.o
main.o: main.c main.h
    gcc -c main.c
           

make指令會自行判斷檔案的正确順序,并使用給出的規則建立相應的檔案,并在螢幕顯示出來。如果多次編譯,則make指令會讀取makefile檔案來确定重建目标的最少指令,而不會重複編譯。

注釋

makefile檔案的注釋以#開頭,到一行的結束。

makefile檔案中也可以定義宏,也可以用make指令時在指令行定義,如果需要使用檔案外部定義,最好不要用空格。

#宏定義
SRC = example.c
OBJS = example.o
CC = gcc
CFALGS = -o

#宏引用
test: sqlite3.o $(OBJS)
    $(CC) $(CFALGS) test sqlite3.o $(OBJS) -ldl -lpthread
           

内置宏:

$?:目前目标所依賴的檔案清單中比目前目标檔案還要新的檔案
$@:目前目标的名字
$<:目前依賴檔案的名字
$*:不包括字尾名的目前依賴檔案的名字
-:使make忽略錯誤
@:執行時不将該條指令顯示在标準輸出
           

應用

下面放一個一個我寫的Makefile

SRC = example.c
OBJS = example.o
CC = gcc

test: sqlite3.o $(OBJS)
    $(CC) -o test sqlite3.o $(OBJS) -ldl -lpthread
sqlite3.o: sqlite3.c sqlite3.h
    $(CC) -c sqlite3.c -o sqlite3.o  
example1.o: $(SRC) sqlite3.h
    $(CC) -c $(SRC) -o example1.o

clean:
    -rm -f *.o test
           

回報與建議

  • 微網誌:@AnSwEr不是答案
  • github:AnSwErYWJ
  • 部落格:AnSwEr不是答案的專欄

繼續閱讀