我现在真的很困惑。
所以我有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 manual以了解更多您可以做的所有花哨的事情。

关于c - 我到底如何使用makefile?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1838040/

10-11 15:54