2010-02-16 70 views

回答

22

Makefile文件是這樣的:

all: mybinary 

mybinary: files.o it.o depends.o on.o 
[tab]$(CC) $(CFLAGS) files.o it.o depends.o on.o -o mybinary 

files.o: files.c files.h 
[tab]$(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o [email protected] 

... 

這意味着,當你鍵入make all(簡寫只是鍵入make),這將確保該mybinary目標或文件是最新的。要做到這一點,需要確保mybinary比所有files.o it.o depends.o和on.o更新。如果不是,那麼它使用下一行指定的shell命令來構建mybinary。但在這之前,它首先確保files.o等等是最新的。這意味着它們必須比files.c和files.h更新。如果沒有,那麼它使用下一行指定構建files.o的shell命令。一旦所有的* .o文件都是最新的,它可以構建mybinary。一旦建立了mybinary,所有的目標都會得到滿足。

目標通常只是文件。塊的格式是:

target: list of dependency files 
[tab]shell commands to build target if it's older than any of its dependencies 
[tab]more shell commands 
[tab]still more 

目標也可以使用通配符指定的,比如%.c意味着你會打電話的外殼是什麼*.c

某些目標是「假目標」目標,意味着它們不對應於任何真實文件。 「全部」目標就是這種類型。 「乾淨」目標也是如此(make clean)。等等。您並不需要或不想構建一個名爲「all」或「c​​lean」的文件。有很多方法可以指定一個目標是假的。

出現在Makefile中的第一個目標是如果您只需鍵入make就會被調用的目標。一個慣例是將這個目標命名爲「全部」。那麼make將與make all相同。

+0

「*它需要確保mybinary比所有files.o it.o depends.o和on.o *更新」...;這是如何完成的?這是通過比較上次修改時間來完成的嗎? – Pacerier 2016-08-08 09:44:06

+0

是的,通過比較文件上次修改時間。實際上,這導致創建UNIX實用程序'touch',其目的是更新文件的修改日期,以觸發構建。 – 2016-08-08 21:10:40

2

A makefile通常會包含代碼以使您的程序,安裝程序,清理以及其他事情。

這樣的話target可能是不同的關鍵字,如allinstallclean

這是說讓東西的一種方式。 make all意味着盡一切力量

+3

嚴格地說,當然,命令'make all''只意味着(狀態)「做必要的工作以確保'全部'是最新的」。通常情況下,人們編寫makefile以便完成大部分所需(但不會自動執行安裝)。但那只是一個慣例。 – 2010-02-16 04:41:08

5

'make target'基本上是一個你想要重建的文件。

Make不能推定你想要構建的東西,所以你必須隱含或明確地告訴它應該建立什麼。通常,文件中的第一個目標是諸如'all'之類的名稱,如果您運行沒有任何明確目標的'make',它將構建makefile中列出的第一個目標。但是,一些makefile並未指定任何目標;那麼你必須在命令行中指定一個。或者,如果您不想構建默認目標,則必須指定您要構建的目標。

根據GNU make,目標也可以是'假'。也就是說,它是一個不存在的名稱,規則不創建它,但它(假目標)取決於其他許多與它們有關聯的規則的文件。事實上,「全部」目標通常是虛假目標 - 在大多數目錄中沒有一個名爲「全部」的文件。

1

make是一種常見的開發工具,它檢查源代碼文件,並從它們產生的目標代碼之間的文件的日期,並編譯所述一個其中源是較新的。它通過使用名爲makefile的文件來完成此操作,該文件列出了需要比較的文件。

的標準語法是make /f makefile myprog.exe

,說使用的makefile文件列表建立MYPROG.EXE。 makefile默認爲makefile.mak,所以如果使用該名稱,則不必在命令行中指定它。

myprog.exe這裏稱爲目標。一個訣竅是,你可以在makefile中爲不存在文件的構建指令列表。如果你然後說建立這個目標,它將運行這些命令。通常,您會看到類似make clean的文件,其中臨時文件已被刪除。

+0

「標準」的含義? – Pacerier 2016-08-08 09:58:40

+0

這意味着大多數'make'程序將接受這種語法來完成我在下一段中所描述的內容。有很多'make'的變體,所以我不能說所有的變體,但是大多數都會接受這個語法。 – 2016-08-08 21:07:13

+0

實際上是否有任何推薦的官方「製造」標準? – Pacerier 2016-08-09 02:30:45