如何寫 makefile檔案

2021-08-30 01:16:21 字數 2768 閱讀 8495

如何寫 makefile檔案

學習別人的程式就面臨著重寫makefile的問題.下面以問答的形式來解釋如何寫makefile檔案.

1.makefile的核心:

target...(目標檔案|object檔案|可執行檔案|標籤) : prerequisites( 生成target所需要的檔案,也可以是target中的一種...)

command (shell 命令)

target這乙個或多個的目標檔案依賴於prerequisites中的檔案,其生成規則定義在command中。prerequisites中如果有乙個以上的檔案比target檔案更新的話,command所定義的命令就會執行。

2.make 的工作原理:

例, 檔名:makefiletest

test : test.o

gcc -o test test.o

test.o: test.h test.c

gcc -c test.c

clean:

rm test.o test

在預設方式下,只輸入make命令。其會做如下工作:

make會在當前目錄下找名字為「makefile檔案」或「makefile檔案」的檔案。如果找到,它會找檔案中的第乙個目標檔案(target)。在上面的例子中,它會找到makefiletest這個檔案,並把test作為最終的目標檔案;如果test檔案不存在,或是test所依賴的後面的 .o 檔案的修改時間要比test這個檔案新,它就會執行後面所定義的命令來生成test檔案。

如果test所依賴的.o檔案也存在,make會在當前檔案中找目標為.o檔案的依賴性,如果找到,則會根據規則生成.o檔案(這有點像乙個堆疊的過程)。

當然,c檔案和h檔案如果存在,make會生成 .o 檔案,然後再用 .o 檔案生成make的最終結果,也就是執行檔案test。

這就是整個make的依賴性,make會一層又一層地去找檔案的依賴關係,直到最終編譯出第乙個目標檔案。在找尋的過程中,如果出現錯誤,比如最後被依賴的檔案找不到,make就會直接退出,並報錯。而對於所定義的命令的錯誤,或是編譯不成功,make就不會處理。如果在make找到了依賴關係之後,冒號後面的檔案不存在,make仍不工作

通過上述分析,可以看出像clean這樣沒有被第乙個目標檔案直接或間接關聯時,它後面所定義的命令將不會被自動執行,不過,可以顯式使make執行。即使用命令make clean,以此來清除所有的目標檔案,並重新編譯。

在程式設計中,如果這個工程已被編譯過了,當修改了其中乙個原始檔時,比如test.c,根據依賴性,目標test.o會被重新編譯(也就是在這個依賴性關係後面所定義的命令),則test.o檔案也是最新的,即test.o檔案的修改時間要比test要新,所以test也會被重新連線了。

3 定義變數:

ltest=test.h test.c

上面的makefiletest可以改寫為:

test : test.o

gcc -o test test.o

test.o: $(ltest)

gcc -c test.c

clean:

rm test.o test

4 makefile檔案的自動推導

test : test.o

gcc -o test test.o

test.o: test.h

clean:

rm test.o test

看一下test.o這個target,省略了 prerequisites的 test.c和command的gcc -c test.c,這些是target為test.o能推導出來的.

5 清空目標檔案

.phony : clean

clean :

-rm test.o test

前面說過,.phony表示clean是乙個「偽目標」,而在rm命令前面加了乙個小減號的目的是,如果某些文 件出現問題將被忽略,繼續進行後面的操作。當然,clean的規則不要放在檔案的開頭,否則會變成make的 預設目標。不成文的規矩是「clean從來都放在檔案的最後」

6.注釋:

#. 為行注釋,與//類似

7.顯示指定makefile檔名

將makefiletest改為make.test

make -f make.test

8.tab鍵

為command命令的識別鍵,在command頭使用,最好不要用在其它地方

9.包含 其它 makefile檔案

include

filename可以是當前作業系統shell的檔案模式(可以保含路徑和萬用字元)。在include前面可以有一些空字元,但是絕不能以[tab]鍵開始。include和可以用乙個或多個空格隔開。舉個例子,有這樣幾個makefile檔案:a.mk、b.mk、c.mk,還有乙個檔案叫foo.make,以及乙個變數$(bar),其包含了e.mk和f.mk,下面的語句:

include foo.make *.mk $(bar)

等價於:

include foo.make a.mk b.mk c.mk e.mk f.mk

10 -include和sinclude 都可以ignore error,

11. make的工作順序

(1) 讀入所有的makefile檔案。

(2) 讀入被include包括的其他makefile檔案。

(3) 初始化檔案中的變數。

(4) 推導隱式規則,並分析所有規則。

(5) 為所有的目標檔案建立依賴關係鏈。

(6) 根據依賴關係,決定哪些目標要重新生成。

(7) 執行生成命令。

12.轉義字元與萬用字元

其它請參見使用者手冊.

如何寫簡單的makefile

作為乙個服務端的程式設計師,在linux下不會寫makefile那就就不能算服務端程式了。最近在重新學c c 寫了乙個簡單的雙向鍊錶,到寫makefile的時候卡住了,太久沒寫,都忘記了,趕緊上網查了點資料,了解簡單寫法,特別在這裡記錄一下。先介紹下檔案結構,當前目錄下有個main.cpp,有兩個目...

如何寫sybase sql指令碼檔案 如何寫好指令碼?

好的指令碼當然要有好的開場白 好的開題 破題 話題引入,好的敘述與分析 好的結束語。好的指令碼還應有好的輔助說明的素材,700 800字的指令碼,對應的素材數量如下 非真人出鏡者 素材數量需要翻倍,最好找到超過20個素材。寫好指令碼還應注意以幾點 一 開門見山 快速切入主題,這樣的話就更容易讓觀眾對...

python函式如何寫 python如何寫函式

python函式的定義 定義函式,也就是建立乙個函式,可以理解為建立乙個具有某些用途的工具。定義函式需要用 def 關鍵字實現,具體的語法格式如下 def 函式名 形參列表 由零條到多條可執行語句組成的 塊 return 返回值 其中,用 括起來的為可選擇部分,即可以使用,也可以省略。此格式中,各部...