C 我如何确切地使用makefile?
我现在真的很困惑 所以我有5个文件:main.c、flight.c、flight.h、passenger.c和passenger.h flight.h为flight.c和passenger.h提供了功能原型。h为passenger.c提供了功能原型 flight.c和passenger.c对这些函数有定义 c是我将与之交互的程序,从两个.c文件调用函数 我不太清楚.o文件的用途,有人能解释一下吗?这是我的Makefile:C 我如何确切地使用makefile?,c,makefile,C,Makefile,我现在真的很困惑 所以我有5个文件:main.c、flight.c、flight.h、passenger.c和passenger.h flight.h为flight.c和passenger.h提供了功能原型。h为passenger.c提供了功能原型 flight.c和passenger.c对这些函数有定义 c是我将与之交互的程序,从两个.c文件调用函数 我不太清楚.o文件的用途,有人能解释一下吗?这是我的Makefile: flight.o: flight.c flight.h gcc
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
编辑:然后我使用命令“makemakefile”,并得到一个错误:make:对“Makefile”不做任何操作
在我的文件中,gcc前面有一个选项卡。
我非常感谢任何帮助,我确信我做了很多错事。谢谢
我不太确定.o文件是什么
有人想解释一下吗
.o是对象文件,是由编译器创建的临时文件,其中包含类的目标代码。链接器将链接目标代码以创建可执行的二进制文件
我不太确定.o文件是什么
有人想解释一下吗
.o是对象文件,是由编译器创建的临时文件,其中包含类的目标代码。链接器将链接目标代码以创建可执行的二进制文件 您的问题是使用了错误的命令。我将在makefile的顶部添加以下行:
all: reservations.out
然后在命令行中键入make
。如果您不想编辑该文件,只需使用makereservations.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
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)
.PHONY:都是干净的
BIN=预订
OBJ=航班o乘客o主航班o
全部:$(BIN)
%.o:%.c%.h
gcc-Wall-g-c$<
main.o:main.c
gcc-Wall-g-c$<
$(BIN):$(OBJ)
gcc-Wall-g-o$@$^
清洁:
rm-f$(OBJ)$(银行标识代码)
我建议您查看,以了解有关您可以执行的所有高级操作的更多信息。您的问题在于使用了错误的命令。我将在makefile的顶部添加以下行:
all: reservations.out
然后在命令行中键入make
。如果您不想编辑该文件,只需使用makereservations.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
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)
.PHONY:都是干净的
BIN=预订
OBJ=航班o乘客o主航班o
全部:$(BIN)
%.o:%.c%.h
gcc-Wall-g-c$<
main.o:main.c
gcc-Wall-g-c$<
$(BIN):$(OBJ)
gcc-Wall-g-o$@$^
清洁:
rm-f$(OBJ)$(银行标识代码)
我建议您查看以了解更多关于您可以做的所有花哨事情。make
具有从C源代码生成二进制文件的隐式规则,您不需要为此指定显式规则
所以你的极简Makefile
看起来像
CFLAGS = -Wall -g
.PHONY all clean
all: myprogram
myprogram: source1.c source2.c
clean:
rm -f myprogram
它有一个有用的副作用——编译后,所有中间文件(*.o
文件)都将自动删除
来自CFLAGS
的选项将添加到gcc
命令行-make
隐式规则执行此操作。make
具有从C源代码生成二进制文件的隐式规则,您不需要为此指定显式规则
所以你的极简Makefile
看起来像
CFLAGS = -Wall -g
.PHONY all clean
all: myprogram
myprogram: source1.c source2.c
clean:
rm -f myprogram
它有一个有用的副作用——编译后,所有中间文件(*.o
文件)都将自动删除
来自CFLAGS
的选项将添加到gcc
命令行-make
隐式规则。编辑器是否将选项卡转换为空格?它需要是一个制表符。看起来它在我解开使用空间选项后被转换回空间,我不检查“创建MaxFipe”,键入“保留。out”。只需调用程序“保留”,out out扩展就不常见了。BTW,让确实有一个<代码> -f>代码>选项来指定MaMo文件,因此,make-f Makefile
执行您试图使用make Makefile执行的操作。但是Makefile
是GNU默认使用的许多神奇名称之一,因此这里不需要-f
。要生成的非选项参数是