我究竟如何使用makefile?

kev*_*vin 1 c 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
Run Code Online (Sandbox Code Playgroud)

编辑:然后我使用命令"make Makefile",并得到一个错误:make:没有什么可以为`Makefile'做.

在我的文件中,gcc之前有一个标签.我很感激任何帮助,我确信有很多事情我做错了.谢谢.

Car*_*rum 10

你的问题是你使用了错误的命令.我将以下行添加到makefile的顶部:

all: reservations.out
Run Code Online (Sandbox Code Playgroud)

然后只需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
Run Code Online (Sandbox Code Playgroud)

另外,你有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
Run Code Online (Sandbox Code Playgroud)

但是,如果你想进一步了解细节,我真正要做的就是下面.对于这样一个小项目来说,这可能有点过分,但在必要时调整和调整也更容易.

.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)
Run Code Online (Sandbox Code Playgroud)

我建议您查看GNU make手册,以了解有关您可以执行的所有花哨内容的更多信息.