簡體   English   中英

將命令轉換為 Makefile

[英]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 時,你通常從最后開始,然后朝着開始的方向努力。 您從最終產品開始,並給出有關如何從起點開始生產該產品的規則。

在這種情況下,您似乎有兩個最終產品: AC

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM