Makefile編寫

Makefile編寫

1. make和Makefile的介紹shell

1.1 make工具函數

利用make工具能夠自動完成編譯工做。這些工做包括:工具

若是僅僅修改了某幾個源文件,則只從新編譯這幾個源文件;若是某個頭文件被修改,則從新編譯全部包含該頭文件的源文件。利用這種自動編譯可大大簡化開發工做,避免沒必要要的從新編譯。spa

1.2 Makefile.net

make工具經過一個稱爲Makefile的文件來完成並自動維護編譯工做。Makefile文件描述了整個工程的編譯、連接等規則。命令行

2. Makefile基本規則開發

TARGET ...:DEPENDENCIES ...自動化

    COMMANDio

    ...編譯

目標(TARGET)程序產生的文件,如可執行文件和目標文件;目標也能夠是要執行的動做,如clean,也稱僞目標。

依賴(DEPENDENCIES)是用來產生目標的輸入文件列表,一個目標一般依賴於多個文件。

命令(COMMAND)是make執行的動做(命令是shell命令或者是可在shell下執行的程序)。注意:每一個命令行的起始字符必須爲TAB字符。

若是DEPENDENCIES中有一個或多個文件更新的話,COMMAND就要執行,這就是Makefile最核心的內容。

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

.PHONY:clean

main:main.o sub.o add.o print.o

    gcc -Wall -g main.o add.o sub.o print.o -o main

main.o:main.c

    gcc -Wall -g -c main.c -o main.o

add.o:add.c add.h

    gcc -Wall -g -c add.c -o add.o

sub.o:sub.c sub.h

    gcc -Wall -g -c sub.c -o sub.o

print.o:print.c print.h

    gcc -Wall -g -c print.c -o print.o

clean:

    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文件。咱們寫了四條**.o:**.c而後執行gcc -Wall -g -c **.c -o **.o,這些語句就會生成目標文件的依賴項。

clean是一個僞目標文件,由於它沒有依賴項。咱們只是想經過make clean來將.o文件刪除,可是咱們一般要指定.PHONY:clean這條語句,用來顯式的指定clean是僞目標,來防止當前目錄下有一個同名的clean文件。這樣,一個簡單呢的Makefile文件就寫好了。

3. Makefile自動化變量

雖然像上述那樣能夠完成編譯,可是明顯很是麻煩,接下來介紹Makefile的自動化變量。

選項名 做用

$@ 規則的目標文件名

$< 規則的第一個依賴文件名

$^ 規則的全部依賴文件列表

咱們使用這些自動化變量來嘗試從寫剛纔的Makefile

.PHONY:clean

OBJ=main.o sub.o add.o print.o

main:$(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:clean

 

CC = gcc

CFLAGS = -Wall -g

OBJ = main.o sub.o add.o print.o

main:$(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 */)

更多精彩內容敬請期待電魚電子(www.dianyu.net)

相關文章
相關標籤/搜索