Makefile學習(一)[第二版]

來源:互聯網
上載者:User

標籤:linux   makefile   編譯   

簡介

1)make:利用 make 工具可以自動完成編譯工作。這些工作包括:如果僅修改了某幾個源檔案,則只重新編譯這幾個源檔案[make通過比對相應的.c檔案與.o檔案的時間];如果某個標頭檔被修改了,則重新編譯所有包含該標頭檔的源檔案。利用這種自動編譯可大大簡化開發工作,避免不必要的重新編譯。

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

 

Mackfile基本規則

Target ...: Dependencies ...

Command ...

 

說明:

1)目標(TARGET):即最終想要產生的檔案,如:可執行檔,目標檔案或中間檔案等;目標也可以是要執行的動作,如clean,也稱為偽目標。

2)依賴(DEPENDENCIES):為了產生目標檔案而依賴的檔案清單,一個目標通常依賴於多個檔案。

3)命令(COMMAND):是make執行的動作(shell命令或是可在shell下執行的程式,如echo)。注意:每個命令列的起始字元必須為TAB字元!

如果DEPENDENCIES中有一個或多個檔案更新的話,COMMAND就要執行,這就是Makefile最核心的內容.

 

簡單的Mackfile樣本

 

#1 最簡單

hello:

gcc -o hello hello.c

 

#2 稍微複雜

hello:hello.o

gcc -o hello hello.o

 

hello.o:

gcc -o hello.o -c hello.c

 

#3 進一步完善

hello:hello.o

gcc -o hello hello.o

 

hello.o:

gcc -o hello.o -c hello.c

 

clean:

rm -rf hello.o  #delete file hello.o

 

#4在Mackfile中執行shell命令[@符號:不輸出命令本身]

hello:hello.o

gcc -o hello hello.o

@echo "--------------ok------------"

 

hello.o:

gcc -o hello.o -c hello.c

 

clean:

rm -rf hello.o  #delete file hello.o

 

#5 綜合[.PHONY:#顯示聲明偽目標]

.PHONY: clean

main: main.o sub.o add.o

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

 

main.o: main.c

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

 

add.o: add.c add.h

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

 

sub.o: sub.c sub.h

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

 

clean:

rm -f main.o sub.o add.o

 

執行:

1)make#產生第一個目標

2)make clean#“產生”clean偽目標

3)make main.o#僅產生main.o目標

4)make -f Mackfile#顯示指定執行的檔案名稱

 

Makefile變數

為了簡化和維護Mackfile,可以在Mackfile中使用變數,格式

varname=some_text

引用變數的值:$(varname)

按照慣例,在Mackfile中,變數一般大寫

 

 

Makefile自動化變數

選項名

作用

[email protected]

規則的目標檔案名

$<

規則的第一個依賴檔案名稱

$^

規則的所有依賴文列表

$*

不包括尾碼名的當前依賴檔案名稱

$?

當前目標所依賴的檔案清單中比當前目標檔案還要新的檔案

 

 

#綜合樣本

.PHONY: clean

.SUFFIXES: .c .o

.c.o:

    gcc -Wall -g -o [email protected] -c $^

 

OBJECTS = main.o sub.o add.o

SOURCES = $(OBJECTS:.o=.c)

 

main: $(OBJECTS)

    gcc -Wall -g -o [email protected] $^

 

clean:

    @echo "delete execute file and object file..."

    rm -f $(OBJECTS) main

 

附-

.SUFFIXES:.c .o#表示任何x.c檔案與x.o檔案關聯

 

Make使用隱含推導規則/產生多個可執行檔

#樣本-產生多個可執行檔1

.PHONY: clean all 

 

BIN = 01test 02test

 

all: $(BIN)

 

clean:

    -rm -f $(BIN)

 

#樣本-產生多個可執行檔2-使用自己定製的規則,產生.o中間檔案

.PHONY: clean all 

 

BIN = 01test 02test

OBJECTS = $(BIN:=.o)

 

all: $(BIN)

 

01test.o: 01test.c

02test.o: 02test.c

 

clean:

-rm -f $(BIN) $(OBJECTS)

 

#樣本-產生多個可執行檔3-使用更加細緻的規則

.PHONY: clean all 

    

CFLAGS = -g -Wall

CC = gcc 

 

BIN = 01test 02test

OBJECTS = $(BIN:=.o)

 

.SUFFIXES: .c .o

.c.o:

    $(CC) $(CFLAGS) -c $< -o [email protected]

 

all: $(BIN)

 

01test.o: 01test.c

02test.o: 02test.c

 

clean:

    -rm -f $(BIN) $(OBJECTS)

 

模式規則與尾碼規則

%.o:%.c

.c.o:

 

#樣本

.PHONY: clean all 

 

CC = gcc 

CFLAGS = -Wall -g

BIN = 01test 02test 

SOURCES = $(BIN:=.c)

OBJECTS = $(BIN:=.o)

 

all: $(BIN)

 

01test: 01test.o

02test: 02test.o

 

#%.o: %.c#模式規則

#   $(CC) $(CFLAGS) -c $< -o [email protected]

.c.o:#尾碼規則,與前作用相同

    $(CC) $(CFLAGS) -c $< -o [email protected]

 

clean:

    -rm -rf $(BIN) $(OBJECTS) 


Makefile學習(一)[第二版]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.