我究竟如何使用makefile?
我此刻真的很困惑。
所以我有5个文件:main.c,flight.c,flight.h,passenger.c和passenger.h
flight.h有flight.c的函数原型,passenger.h有passenger.c的函数原型
flight.c和passenger.c有这些function的定义。
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
隐式规则执行此操作。