[英]Turning commands into a Makefile
我一直在閱讀 Makefile,但我仍然對如何將以下命令寫入 Makefile go 一無所知。
gcc -std=c89 A.c -c
gcc -std=c89 B.c -c
gcc -std=c89 C.c -c
gcc -std=c89 A.o B.o -o A
gcc -std=c89 C.o B.o -o C
A和C依賴於B,但是是獨立的程序。
這是我想出的,但不起作用:
CC = gcc -std=c89
FILES = A.c B.c C.c
OUT = out
build: $(FILES)
$(CC) -o $(OUT) $(Files)
clean:
rm -f *.o core
這是一個沒有噱頭的makefile,而gcc和rm之前的必須是'tab'字符,它們不是空格。
all: A C
A.o: A.c
gcc -std=c89 -c A.c
B.o: B.c
gcc -std=c89 -c B.c
C.o: C.c
gcc -std=c89 -c C.c
A: A.o B.o
gcc -std=c89 -o A A.o B.o
C: C.o B.o
gcc -std=c89 -o C C.o B.o
clean:
rm A C a.o b.o c.o core
試試這個:
X1 = A
O1 = A.o B.o
X2 = B
O2 = C.o B.o
DBGFLAGS = -g -O0
CFLAGS = -W -Wall $(DBGFLAGS)
all: $(X1) $(X2)
$(X1): $(O1)
$(CC) $(LDFLAGS) -o $@ $(O1) $(LIBS)
$(X2): $(O2)
$(CC) $(LDFLAGS) -o $@ $(O2) $(LIBS)
.PHONY: clean
clean:
rm -f $(X1) $(O1) $(X2) $(O2) *~
如果復制粘貼不這樣做,請將 8 個空格更改為一個制表符。
當你寫一個 makefile 時,你通常從最后開始,然后朝着開始的方向努力。 您從最終產品開始,並給出有關如何從起點開始生產該產品的規則。
在這種情況下,您似乎有兩個最終產品: A
和C
。
all: A C
如果您沒有在命令行上指定目標,make 將構建它在 makefile 中看到的第一個目標。因此,您希望將其作為文件中的第一個目標,其他目標位於其下方。 如果你把它想象成一棵樹,這就是樹的根,下面的每一項都是那棵樹的一個分支。
也可以定義不包含在該根目錄下的次要目標。 例如,許多(大多數?)makefile 包含一個名為clean
的目標,該目標刪除所有將在構建過程中創建的中間文件。 這將僅在/如果用戶調用make clean
時使用,而不是僅作為命令發出make
的一部分。
無論如何,然后你告訴它每個依賴的東西,以及如何從它依賴的東西創建它:
A: A.o B.o
$(CC) -o A A.o B.o
C: B.o C.o
$(CC) -o B B.o C.o
然后(如有必要——它不在這里)您將告訴它每個.o
文件如何依賴於.c
文件。 然而,Gmake(就像幾乎所有存在的make
工具一樣)有內置規則告訴它如何編譯 C 或 C++ 文件以生成匹配的 object 文件。 這些將類似於您的 makefile 在頂部包含類似這樣的內容:
CC = gcc
.c.o:
$(CC) $(CFLAGS) -c $*.c
這會將 CFLAGS 的當前值作為標志傳遞給編譯器,因此您想將其設置為您需要的標志——在您的情況下:
CFLAGS = -std=c89
您通常希望將其放在 makefile 的頂部,通常位於任何目標之前。
我應該補充一點,這甚至沒有涵蓋您在 makefile 中可以做的所有事情。當您處理大量文件時,有很多快捷方式非常方便,但當您處理大量文件時就沒有用了。只有三個源文件。
假設您使用GNU make ,您可以主要依賴內置規則:
CFLAGS = -std=c89
LDFLAGS = -std=c89
A: A.o B.o
C: C.o B.o
這將執行您列出的命令。 但是,它不關心清潔或類似的東西。 不過,您不一定需要它make
程序會注意到何時需要重新編譯/重新鏈接並自動執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.