C 我如何确切地使用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

我现在真的很困惑

所以我有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 -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
。要生成的非选项参数是