Makefile編寫入門教程

來源:互聯網
上載者:User

Makefile編寫入門教程
Makefile編寫1. make和Makefile的介紹1.1 make工具

利用make工具可以自動完成編譯工作。這些工作包括:

  • 如果僅僅修改了某幾個源檔案,則只重新編譯這幾個源檔案;
  • 如果某個標頭檔被修改,則重新編譯所有包含該標頭檔的源檔案。

利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯。

1.2 Makefile

make工具通過一個稱為Makefile的檔案來完成並自動維護編譯工作。Makefile檔案描述了整個工程的編譯、連結等規則。

2. Makefile基本規則
TARGET ...:DEPENDENCIES ...    COMMAND    ...
  • 目標(TARGET)程式產生的檔案,如可執行檔和目標檔案;目標也可以是要執行的動作,如clean,也稱偽目標。
  • 依賴(DEPENDENCIES)是用來產生目標的輸入檔案清單,一個目標通常依賴於多個檔案。
  • 命令(COMMAND)是make執行的動作(命令是shell命令或者是可在shell下執行的程式)。注意:每個命令列的起始字元必須為TAB字元。
  • 如果DEPENDENCIES中有一個或多個檔案更新的話,COMMAND就要執行,這就是Makefile最核心的內容。

接下來就根據這個Makefile基本規則來編寫一個最基本的Makefile檔案

.PHONY:cleanmain:main.o sub.o add.o print.o    gcc -Wall -g main.o add.o sub.o print.o -o mainmain.o:main.c     gcc -Wall -g -c main.c -o main.oadd.o:add.c add.h    gcc -Wall -g -c add.c -o add.osub.o:sub.c sub.h    gcc -Wall -g -c sub.c -o sub.oprint.o:print.c print.h    gcc -Wall -g -c print.c -o print.oclean:    rm -f *.o main

我們可以看到,main是我們最終想要產生的目標檔案,它依賴main.o sub.o add.o print.o這四個.o檔案。因此要執行gcc -Wall -g main.o add.o sub.o print.o -o main命令來產生目標檔案,但是當前沒有這些.o檔案,因此就要先產生這些.o檔案。我們寫了四條xxx.o:xxx.c然後執行gcc -Wall -g -c xxx.c -o xxx.o,這些語句就會產生目標檔案的依賴項。

clean是一個偽目標檔案,因為它沒有依賴項。我們只是想通過make clean來將.o檔案刪除,但是我們通常要指定.PHONY:clean這條語句,用來顯式的指定clean是偽目標,來防止目前的目錄下有一個同名的clean檔案。這樣,一個簡單呢的Makefile檔案就寫好了。

3. Makefile自動化變數

雖然像上述那樣可以完成編譯,但是明顯非常麻煩,接下來介紹Makefile的自動化變數。

選項名 作用
$@ 規則的目標檔案名
$< 規則的第一個依賴檔案名稱
$^ 規則的所有依賴檔案清單

我們使用這些自動化變數來嘗試從寫剛才的Makefile

.PHONY:cleanOBJ=main.o sub.o add.o print.omain:$(OBJ)    gcc -Wall -g $^ -o $@main.o:main.c     gcc -Wall -g -c $< -o $@ add.o:add.c add.h    gcc -Wall -g -c $< -o $@ sub.o:sub.c sub.h    gcc -Wall -g -c $< -o $@ print.o:print.c print.h    gcc -Wall -g -c $< -o $@clean:    rm -f *.o main

我們定義了一個變數叫OBJ,他是我們的依賴項列表。然後使用自動化變數來代替對應的檔案,如上所示。

但是,我們這些.c檔案都要產生.o檔案,這樣寫也非常麻煩,我們介紹另一些規則。

  • 模式規則
    • %.o:%.c
  • 尾碼規則
    • .c:.o

我們來使用這兩種規則:

.PHONY:cleanCC = gccCFLAGS = -Wall -g OBJ = main.o sub.o add.o print.omain:$(OBJ)    $(CC) $(CFLAGS) $^ -o $@#%.o:%.c.c.o:    $(CC) $(CFLAGS) -c $< -o $@clean:    rm -f *.o main

使用這兩個規則,就會將所有.c檔案產生同名的.o檔案,這樣,Makefile就更加簡潔。

4. make常用的內嵌函數
  • 函數調用
    • $(function arguments)
  • $(wildcard PATTERN)
    • 目前的目錄寫的匹配模式的檔案
    • 例如:src=$(wildcard *.c)
  • $(patsubst PATTERN,REPLACEMENT,TEXT)
    • 模式替換函數
    • 例如:$(patsubst %.c, %.o, \$src)
    • 等價於$(src:.c=.o)
  • shell函數
    • 執行shell命令
    • 例如:$(shell ls -d */)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.