舉例書寫Makefile檔案 C語言)

2021-06-19 01:28:10 字數 2074 閱讀 3411

在這裡,我自己寫乙個自己的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$ ls

makefile 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 = gcc

cflags = -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 就是完成這個功能的,如果沒有指明...