在這裡,我自己寫乙個自己的makefile的例子,說明一下makefile是怎麼寫的。
進入目錄,我們來建立乙個自己的makefile檔案,自己編譯自己的程式。
在unpv13e/ 這個目錄內建立自己的乙個目錄。 拷貝unpv13e/tcpcliserv/ 目錄下的 tcpserv01.c 和 str_echo08.c 到自己建立的目錄下,給他們命名為tcpserv.c 和 str_echo.c。 並在這個目錄下建立自己的makefile檔案。
首先,在目錄 ~/unp/unpv13e/test/tcpserv 這個資料夾下寫自己的程式,有兩個檔案,tcpserv.c 和 str_echo.c,還有自己寫的makefile 檔案:
test@ubuntu:~/unp/unpv13e/test/tcpserv$ lsmakefile str_echo.c tcpserv.c
tcpserv.c 和 str_echo.c這兩個檔案都是用 unp.h 這個標頭檔案,而這個檔案的位置在 ~/unp/unpv13e/lib/ 這個目錄中。它們不再呼叫其他標頭檔案。
tcpserv.c 的開頭為:
#include "unp.h"
str_echo.c 的開頭為:
#include "unp.h"
在unp.h中,它自己又使用其它的標頭檔案:
#include "../config.h" /* configuration options for current os */#include /* soem other headers …… */
# include "../lib/addrinfo.h"
我的makefile 檔案是這樣寫的:
cc = gcccflags = -i../../lib -wall
tcpserv: tcpserv.o str_echo.o
$(cc) $(cflags) -o $@ $^ ../../libunp.a
.phony: clean
clean:
-rm *.o tcpserv
其中 –i../../lib 標記表示gcc 編譯的時候,以makefile檔案所在的目錄為基準,在目錄 ../../lib 中查詢標頭檔案,也就是在~/unp/unpv13e/lib/ 這個檔案中查詢。../../lib是乙個相對路徑,你也可以把它換成絕對路徑,比如 –i/home/test/unp/unpv13e/lib
-wall 選項進行更好的判斷。
$@ 表示target,這裡即tcpserv
$^ 表示所有 依賴關係,這裡即tcpserv.o 和 str_echo.o
../../libunp.a 是乙個庫檔案(在unix中叫做archive file),裡面放有很多自己定義的函式,我在tcpserv.c 和 str_echo.c 中都使用到了這些函式。.a 檔案是把好多 .o 檔案合在一起構成的乙個檔案,它並不依賴於.c原始檔的存在。
.phony: clean 是指定clean為偽目標,即clean是乙個假的target,make命令不會生成這個檔案。
rm命令之前有乙個小小的減號,表明忽略錯誤,繼續執行。
如果rm之間沒有減號,那麼一旦出錯,就會停止執行。看下面的**:
clean:rm *.o
rm tcpserv
在終端中執行 make clean 命令,如果當前目錄下只有tcpserv.c str_echo.c makefile 這三個檔案,那麼就會出現下面的情況:
rm *.o
rm: 無法刪除 「*.o」: 沒有那個檔案或目錄
make: *** [clean] 錯誤 1
執行到rm *.o之後就會停下來,不再執行rm tcpserv了。
編好自己的makefile 之後,可以在終端中執行make –n命令檢視自己所寫的makefile 檔案會執行哪些命令,這可以用來判斷我們的makefile是否正確。
使用make 命令進行編譯。
makefile學習筆記 書寫規則 規則舉例
20180413 makefile學習筆記 書寫規則 規則舉例 規則包含兩個部分,乙個是依賴關係,乙個是生成目標的方法。在makefile中,規則的順序是很重要的,因為,makefile中只應該有乙個最終目標,其他的目標都是被這個目標所連帶出來的,所以一定要讓make知道你的最終目標是什麼。一般來說...
makefile語法舉例
all gcc servo.c o servo clean rm rf servo servo.o main main.o gcc main.o o main main.o main.c gcc c main.c clean rm rf main.o main 不包括字尾名的當前依賴檔案的名稱 所有...
makefile 書寫規則三 檔案搜尋
在一些大的工程中,有大量的原始檔,我們通常的做法是把這許多的原始檔分類,並存放在不同的目錄中。所以,當make需要去找尋檔案的依賴關係時,你可以在檔案前加上路徑,但最好的方法是把乙個路徑告訴make,讓make在自動去找。makefile檔案中的特殊變數 vpath 就是完成這個功能的,如果沒有指明...