我现在真的很困惑。
所以我有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/