[英]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.