小編讀完陳皓大神關于Makefile的博客之后,對Makefile的使用有了更深入的理解,在此附上陳皓大神makefile博客的鏈接:https://blog.csdn.net/haoel/article/details/2886,博客中針對Makefile的介紹、編譯和鏈接原理、以及規則都做了詳細的介紹,因此小編在此僅歸納兩種常用的makefile檔案的寫法,希望可以幫助讀者掌握Makefile的寫法,(閱讀程序中若有不理解之處,可參考陳皓大神的博客,以此來提升理解)
一、初學者和小專案可使用的makefile寫法
舉例:一個專案有1個頭檔案(wrap.h),三個源檔案(server.c、client.c、wrap.c),要生成可執行目標檔案server、client,最簡單的寫法如下所示:
all:server client //目標檔案server和client
server:server.o wrap.o //server的依賴為server.o和wrap.o
gcc server.o wrap.o -o server -Wall //利用gcc編譯器生成可執行檔案server
client:client.o wrap.o //client的依賴為client.o和wrap.o
gcc client.o wrap.o -o client -Wall //利用gcc編譯器生成可執行檔案client
server.o:server.c wrap.h //server.o的依賴為server.c和wrap.h
gcc -c server.c -o server.o -Wall //利用gcc編譯器生成中間目標檔案server.o
client.o:client.c wrap.h //同上
gcc -c client.c -o client.o -Wall
wrap.o:wrap.c wrap.h //同上
gcc -c wrap.c -o wrap.o -Wall
在終端輸入命令make,運行makefile檔案可得到編譯結果如下:

我們可以看到編譯成功,成功生成了client.o、wrap.o、server.o等中間目標檔案以及client、server等可執行目標檔案,并且運行服務器端和客戶端可以實作其功能,在此就不演示了,
該方法比較易懂,只需要依次對我們的.c檔案形成依賴關系,就可以根據目標檔案的需要生成對應的依賴目標,但是當一個專案比較大即有大量的.c檔案時,程式員需要撰寫大量的依賴關系,作業量是非常大的,且容易遺漏出錯,因此需要掌握下面的方法
二、大專案必須會使用的makefile寫法
舉例同上,makefile檔案為:
target1=server //服務器運行目標檔案server
target2=client //客戶端目標檔案client
src=$(wildcard *.c) //用wildcard函式找到所有.c檔案,server.c、client.c、wrap.c
deps=$(wildcard *.h) //用wildcard函式找到所有的.h檔案,wrap.h
obj=$(patsubst %.c,%.o,$(src)) //用patsubst函式將所有.c檔案替換成.o檔案
all:$(target1) $(target2) //目標檔案server和client,多個目標檔案一定形成此依賴關系
$(target1):server.o wrap.o //server的依賴為server.o和wrap.o
gcc $^ -o $@ -Wall //利用gcc編譯器生成可執行檔案server
$(target2):client.o wrap.o //client的依賴為client.o和wrap.o
gcc $^ -o $@ -Wall //利用gcc編譯器生成可執行檔案client
%.o:%.c $(deps) //任意一個.o中間目標檔案的依賴是其對應的.c檔案,如:client.o的依賴為client.c
gcc -c $< -o $@ -Wall //根據目標檔案編譯的需求依次將依賴編譯成對應的中間目標檔案
.PHONY:clean //偽檔案,需要在終端輸入make clean才會呼叫
clean:
-rm -rf $(target1) $(target2) $(obj) //洗掉所有的目標檔案以及中間目標檔案,用于重新編譯,
在終端輸入命令make,運行makefile檔案可得到編譯結果如下:

我們可以看到編譯結果與第一種方法是一樣的,但是依賴關系的表示卻十分簡單,即使有幾百個依賴關系也同樣適用,所以這種寫法對大型專案的開發是非常有好處的
常用的三個自動變數含義:
1、$< 第一個依賴檔案,若有多個目標檔案,依次編譯依賴檔案
2、$^ 所有依賴檔案的集合
3、$@ 目標檔案的集合
三、常用的makefile檔案模板
在本例中,因為涉及到服務器端server和客戶端client有多個目標檔案,但是常規專案中往往只有一個目標檔案,這樣makefile的寫法就更為簡單了,可套用以下模板:
target=main //想要生成的可執行檔案名稱可自定義,此處為main
src=$(wildcard *.c)
deps=$(wildcard *.h)
obj=$(patsubst %.c,%.o,$(src))
$(target):$(obj)
gcc $^ -o $@ -Wall
%.o:%.c $(deps)
gcc -c $< -o $@ -Wall
.PHONY:clean
clean:
-rm -rf $(target) $(obj)
四、總結
常見的生成一個目標檔案的makefile,直接套用第三種方法的模板即可,
生成多個目標檔案的makefile,可參照第二種方法的案例再稍加修改即可,
若有疑問,可在評論區留言!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164913.html
標籤:java
上一篇:想做分布式開發,需要懂哪些技術?
