最常用的工具,要做到這一點make
。它從運行的目錄中的名爲Makefile
的文件中讀取配方,並執行必要的任何任務。它足夠聰明地檢查文件時間戳,以檢測是否需要重新編譯項目的哪些部分或哪些部分需要重新編譯。下面是一個例子生成文件:
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS := -lm
PROGS := number_input
.PHONY: all clean
all: $(PROGS)
clean:
rm -f $(PROGS)
$(PROGS): %: %.c
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected]
注意的是Makefile
縮進必須使用製表符,而不是空格。如果您複製上述內容並粘貼到文件中,則需要運行sed -e 's|^ *|\t|' -i Makefile
來修復縮進。
前三行命名使用的編譯器,編譯器選項和鏈接選項。您的特定用例不需要-lm
鏈接選項;我只是將它包含在內,因爲您遲早會想要使用<math.h>
,然後您確實需要包含-lm
鏈接選項。
PROGS
行命名你的程序。您可以指定多個,只需用空格分隔即可。
.PHONY:
行告訴make
目標all
和clean
是「假的」,它們不生成該名稱的文件。
作爲Makefile
中的第一個配方,all
配方是在運行make
時遵循的默認配方。這說明應該建立PROGS
中列出的所有程序。
clean
配方(運行make clean
)從目錄中刪除所有臨時文件和編譯文件 - 基本上清除它。
最後的食譜是一個棘手的。它說PROGS
中列出的所有文件均由具有相同名稱的文件加.c
後綴構建。 $^
指的是.c
的文件名,而[email protected]
指的是沒有後綴的文件名。
如果Makefile
被用於通過電子郵件返回練習,老師,我還添加了新的目標.PHONY
,tarball
:
CC := gcc
CFLAGS := -Wall -O2
LDFLAGS := -lm
PROGS := number_input
TAR := $(notdir $(CURDIR)).tar
.PHONY: all clean tarball
all: $(PROGS)
clean:
rm -f $(PROGS)
tarball: clean
rm -f ../$(TAR)
tar -cf ../$(TAR) $(notdir $(CURDIR))/
$(PROGS): %: %.c
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o [email protected]
運行make
將編譯number_input
,如果number_input.c
後已被修改最後一次編譯number_input
,或者number_input
尚不存在。
運行make TAR=myname-ex01.tar tarball
從當前目錄中刪除已編譯的文件,然後創建當前目錄(及其子目錄,如果有的話)的tarball,作爲myname-ex01.tar
。如果只運行make tarball
,則tar文件名將與當前目錄的名稱相同,但後綴爲.tar
。
我希望你能明白爲什麼寫Makefile
是如此有用。
你應該使用一個Makefile。 – piwi
你可以使用Makefile。你也可以使用CMake,或忍者,或bfg9000,或gyp,或... – You
...或者什麼都不是,因爲只有一個文件正在編譯! –