Makefile的簡單編寫

當咱們的工程愈來愈大的之後,每次都使用命令編譯顯得很是的麻煩.因此咱們須要一個自動化編譯的工具來幫助咱們編譯.在咱們使用源碼安裝軟件的時候都會有make,make install等操做,這個就是使用Makefile來進行自動化編譯的工做的.shell

Makefile也是一個腳本文件和shell腳本很是的類似,可是也有不少的地方不同.工具

程序編譯一般會有一下幾個步驟,先是預編譯,而後將C語言代碼編譯成彙編,而後在將彙編編譯成二進制文件.o文件,而後將全部的.o文件鏈接起來就獲得了可執行文件.xml

在編寫Makefile時,咱們先將全部的c語言代碼編譯成二進制文件,而後將全部二進制文件連接起來.文檔

和shell相似的,裏面有變量,有命令,有循環,判斷等語句,全部的命令都須要另起一行,並且開始必須是tab鍵(全部開頭是tab鍵的行都會被認爲是命令,哪怕不能執行),變量等必須頂行不能有空格等.源碼

簡單的Makefile格式(不涉及循環,選擇等語句):自動化

TARGET... : PREREQUISITES...
  COMMAND編譯

a:main.othread

  gcc -o main.o變量

main.o:main.cgcc

  gcc -c main.c

這樣就是一個最簡單的Makefile

固然咱們若是是文件多的話這樣寫就很是的麻煩,咱們就可使用 變量名 += .....來進行編輯,使用時直接$(變量名)來使用.(和shell同樣)

咱們也經常會使用make clean的命令等,這個叫作僞目標,直接

clean:

  rm *.o

install:

  cp .. /bin

 

Makefile文件也能夠應用其餘的Makefile文件

include 文件名

 

在咱們寫了.o文件名之後,當.o和.c文件是同名時,咱們也能夠不用.c文件,make會自動查找同名的文件,例如%.o:%.c.

如下是一些自動化變量:

$@
表示規則的目標文件名。若是目標是一個文檔文件(Linux中,通常稱.a文件爲文檔文件,也稱爲靜態庫文件) ,那麼它表明這個文檔的文件名。在多目標模式規則中,它表明的是哪一個觸發規則被執行的目標文件名。

$%
當規則的目標文件是一個靜態庫文件時,表明靜態庫的一個成員名。例如,規則的目標是 「foo.a(bar.o)」 , 那麼, 「$%」 的值就爲 「bar.o」 , 「$@」 的值爲「foo.a」 。
若是目標不是靜態庫文件,其值爲空。

$<
規則的第一個依賴文件名。 若是是一個目標文件使用隱含規則來重建, 則它表明由隱含規則加入的第一個依賴文件。

$?
全部比目標文件更新的依賴文件列表,空格分割。若是目標是靜態庫文件名,表明的是庫成員(.o文件) 。

$^
規則的全部依賴文件列表,使用空格分隔。若是目標是靜態庫文件,它所表明的只能是全部庫成員(.o文件)名。一個文件可重複的出如今目標的依賴中,變量「$^」只記錄它的一次引用狀況。就是說變量「$^」會去掉重複的依賴文件。

$+
相似「$^」 ,可是它保留了依賴文件中重複出現的文件。主要用在程序連接時庫的交叉引用場合。

$*
在模式規則和靜態模式規則中,表明「莖」 。 「莖」是目標模式中「%」所表明的部分 (當文件名中存在目錄時, 「莖」 也包含目錄 (斜槓以前) ) 。例如:文件「dir/a.foo.b」 ,當目標的模式爲「a.%.b」時,「$*」的值爲「dir/a.foo」 。 「莖」對於構造相關文件名很是有用

 

如下是通常的簡單的Makefile寫法:

COBJS += main.o

#CFLAGS += -O2 -Wall -DDEBUG
CFLAGS += -I./

LDFLAGS += -lmxml -lpthread

CROSS_COMPILE ?=

CC = $(CROSS_COMPILE)gcc

TARGET = tag

all:$(TARGET)
$(TARGET):$(COBJS)
$(CC) -o $@ $^ $(LDFLAGS)

%.o:%.c $(CC) $(CFLAGS) -c -o $@ $^ $(LDFLAGS) .PHONY:cleanclean: rm -f $(COBJS)

相關文章
相關標籤/搜索