簡體   English   中英

我到底如何使用makefile?

[英]How exactly do I use a makefile?

此刻我真的很困惑。

所以我有5個文件:main.c,flight.c,flight.h,passenger.c和passenger.h

flight.h具有用於flight.c的函數原型,而passenger.h具有用於passenger.c的函數原型

flight.c和passenger.c具有這些功能的定義。

main.c是我將與之交互的程序,同時從兩個.c文件中調用函數

我不太確定.o文件是做什么用的,請有人解釋。 這是我的Makefile:

flight.o: flight.c flight.h
    gcc -Wall -g -c flight.c    
passenger.o: passenger.c passenger.o
    gcc -Wall -g -c passenger.c    
main.o: main.c
    gcc -Wall -g -c main.c     
reservations.out: main.o flight.o passenger.o
    gcc -Wall -g flight.o passenger.o main.o -o reservations.out

編輯:然后我使用命令“ make Makefile”,並得到一個錯誤:make:對`Makefile'不需要做任何事情。

在我的文件中,gcc之前有一個選項卡。 我將不勝感激,我確定我做錯了很多事情。 謝謝。

您的問題是您使用了錯誤的命令。 我將以下行添加到makefile的頂部:

all: reservations.out

然后,在命令行中鍵入make 如果您不想編輯該文件,只需使用make reservations.out ,您應該獲得正確的行為。

至於.o文件是什么:它是一個“目標”文件,意味着它包含編譯后的(但在這種情況下為未鏈接)代碼。 最終的makefile規則獲取目標文件,並將它們鏈接在一起,成為最終的可執行文件,稱為reservations.out

現在,我再來看一下它,看來您對最終規則有些奇怪的行為。 我認為它應該更像:

reservations.out: main.o flight.o passenger.o
    gcc -Wall -g main.o flight.o passenger.o -o reservations.out

此外,您還passenger.o作為一個先決條件passenger.o ,這是肯定會造成問題。 我會做的是這樣的事情(它可能會更嚴格,但是我想讓它變得簡單明了):

.PHONY: all clean

all: reservations.out

flight.o: flight.c flight.h
    gcc -Wall -g -c flight.c    

passenger.o: passenger.c passenger.h
    gcc -Wall -g -c passenger.c    

main.o: main.c
    gcc -Wall -g -c main.c     

reservations.out: main.o flight.o passenger.o
    gcc -Wall -g main.o flight.o passenger.o -o reservations.out

clean:
    rm -f *.o reservations.out

但是,如果您想進一步了解細節,我會做的實際上是以下內容。 對於一個如此小的項目,這可能有點過大,但根據需要進行調整和擺弄也更容易。

.PHONY: all clean

BIN = reservations
OBJ = flight.o passenger.o main.o

all: $(BIN)

%.o: %.c %.h
    gcc -Wall -g -c $<

main.o: main.c
    gcc -Wall -g -c $<

$(BIN): $(OBJ)
    gcc -Wall -g -o $@ $^

clean:
    rm -f $(OBJ) $(BIN)

我建議您查閱GNU make手冊,以了解有關您可以做的所有奇妙事情的更多信息。

我不太確定.o文件是做什么用的,請有人解釋。

.o是目標文件,即由編譯器創建的臨時文件,其中包含類的目標代碼。 目標代碼將由鏈接器鏈接以創建可執行的二進制文件。

make具有使用C源制作二進制文件的隱式規則,因此無需為此指定顯式規則。

所以您的簡約Makefile看起來像

CFLAGS = -Wall -g
.PHONY all clean

all: myprogram

myprogram: source1.c source2.c

clean:
    rm -f myprogram

它有一個有用的副作用-編譯后,所有中間文件(在您的情況下為*.o文件)都會自動刪除。

CFLAGS選項將添加到gcc命令行- make隱式規則執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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