C 我的makefile有什么问题?

C 我的makefile有什么问题?,c,makefile,C,Makefile,我正在尝试学习并为我的c类作业创建我的第一个makefile,当我调用makefile时收到一个错误 gcc: error: main.o: no such file or directory gcc: error: commands.o: No such file or directory Makefile:13 recipe for target program failed make: ***[program] Error 1 这是我的生成文件: CC = gcc CFLAGS =

我正在尝试学习并为我的c类作业创建我的第一个makefile,当我调用makefile时收到一个错误

gcc: error: main.o: no such file or directory

gcc: error: commands.o: No such file or directory

Makefile:13 recipe for target program failed

make: ***[program] Error 1
这是我的生成文件:

CC = gcc
CFLAGS = -g -std=c11 -Wall -Wextra -Wpedantic -Werror \
-Wfloat-equal -Wlogical-op -Wshadow -Wswitch-default \
-Wbad-function-cast -Wcast-qual -Waggregate-return \
-fno-diagnostics-show-option $(INCLUDES)

PROG = program
HDRS = commands.h faculty.h
SRCS = main.c commands.c faculty.c
OBJS = $(SRCS:.c=.o)

$(PROG) : $(OBJS)
$(CC) $(OBJS) -o $(PROG)

main.o : main.c commands.h faculty.h

faculty.o : faculty.c faculty.h

commands.o : commands.c commands.h

    rm -f core $(PROG) $(OBJS)

TAGS : $(SRCS) $(HDRS)
    Setags -t $(SRCS) $(HDRS)
在我的项目文件夹中包含所有这些头文件和c文件,但是当我调用makefile时,它不会创建main或commands对象,而是创建faculty对象


我做错什么了吗?

问题是makefile包含:

commands.o : commands.c commands.h

    rm -f core $(PROG) $(OBJS)
这些命令被视为从源文件创建对象文件的“操作”,覆盖从源文件编译对象文件的默认规则

因此,当您尝试编译
commands.o
时,程序和所有目标文件都会被删除,从而导致
gcc
在尝试链接程序时发出投诉

有几种可能的修复方法。一种是完全删除
rm
行。另一种是使用:

commands.o : commands.c commands.h

clean:
    rm -f core $(PROG) $(OBJS)

现在,
rm
命令与目标
clean
关联,清除碎片是
clean
目标的正常操作。

问题在于生成文件包含:

commands.o : commands.c commands.h

    rm -f core $(PROG) $(OBJS)
这些命令被视为从源文件创建对象文件的“操作”,覆盖从源文件编译对象文件的默认规则

因此,当您尝试编译
commands.o
时,程序和所有目标文件都会被删除,从而导致
gcc
在尝试链接程序时发出投诉

有几种可能的修复方法。一种是完全删除
rm
行。另一种是使用:

commands.o : commands.c commands.h

clean:
    rm -f core $(PROG) $(OBJS)

现在,
rm
命令与目标
clean
相关联,清除碎片是
clean
目标的正常操作。

除了Jonathan的回答,如果在这两行中

$(PROG) : $(OBJS)
$(CC) $(OBJS) -o $(PROG)

第二行不是以选项卡开头的,您还有一个问题。请确保剪切和粘贴确实复制了Makefile中的内容。

除了Jonathan的答案,如果在这两行中

$(PROG) : $(OBJS)
$(CC) $(OBJS) -o $(PROG)
第二行不是以选项卡开头的,您还有一个问题。请确保剪切和粘贴确实复制了Makefile中的内容。

显示的行

$(CC) $(OBJS) -o $(PROG)
应该缩进一个制表符(不是空格,只是一个制表符)才能正确解析

要正确编译应用程序,您的Makefile应如下所示:

CC = gcc
CFLAGS = -g -std=c11 -Wall -Wextra -Wpedantic -Werror \
-Wfloat-equal -Wlogical-op -Wshadow -Wswitch-default \
-Wbad-function-cast -Wcast-qual -Waggregate-return \
-fno-diagnostics-show-option $(INCLUDES)

PROG = program
HDRS = commands.h faculty.h
SRCS = main.c commands.c faculty.c
OBJS = $(SRCS:.c=.o)

$(PROG) : $(OBJS)
    $(CC) $(OBJS) -o $(PROG)

main.o : main.c commands.h faculty.h

faculty.o : faculty.c faculty.h

commands.o : commands.c commands.h

clean:
    rm -f core $(PROG) $(OBJS)

TAGS : $(SRCS) $(HDRS)
    Setags -t $(SRCS) $(HDRS)
使用制表符(而不是空格,这非常重要)作为缩进字符,并保留此处显示的缩进。要编译,只需执行

make
以及清理项目

make clean
显示的线条

$(CC) $(OBJS) -o $(PROG)
应该缩进一个制表符(不是空格,只是一个制表符)才能正确解析

要正确编译应用程序,您的Makefile应如下所示:

CC = gcc
CFLAGS = -g -std=c11 -Wall -Wextra -Wpedantic -Werror \
-Wfloat-equal -Wlogical-op -Wshadow -Wswitch-default \
-Wbad-function-cast -Wcast-qual -Waggregate-return \
-fno-diagnostics-show-option $(INCLUDES)

PROG = program
HDRS = commands.h faculty.h
SRCS = main.c commands.c faculty.c
OBJS = $(SRCS:.c=.o)

$(PROG) : $(OBJS)
    $(CC) $(OBJS) -o $(PROG)

main.o : main.c commands.h faculty.h

faculty.o : faculty.c faculty.h

commands.o : commands.c commands.h

clean:
    rm -f core $(PROG) $(OBJS)

TAGS : $(SRCS) $(HDRS)
    Setags -t $(SRCS) $(HDRS)
使用制表符(而不是空格,这非常重要)作为缩进字符,并保留此处显示的缩进。要编译,只需执行

make
以及清理项目

make clean

-
和标志之间的那些空格是可疑的。我假设您的意思是在示例-Wfloat equal-Wlogical op中,在我的文本编辑器中,它的间距是正确的。在这里,格式有点混乱。我将对其进行编辑以表示我所看到的内容。问题是,您已经告诉
make
commands.c
commands.h
中创建
commands.o
,方法是删除内核、程序和所有对象文件。因此,当它继续尝试链接时,对象文件已被删除。删除删除文件的行,或将目标
clean:
放在前面的行上,或采取措施抵消造成的损害。@JonathanLeffler使用“复制”“粘贴”重新复制代码。通过删除rm-f core$(PROG)$(OBJS)行测试代码,它确实创建了3个受尊重的c文件的对象文件。如果您不介意解释的话,那么什么时候需要rm命令呢?我只是简单地学习了一下。那些
-
和标志之间的空格是可疑的。我假设你的意思是在示例-Wfloat equal-Wlogical op中,在我的文本编辑器上,它的间距是正确的。在这里,格式有点混乱。我将对其进行编辑以表示我所看到的内容。问题是,您已经告诉
make
commands.c
commands.h
中创建
commands.o
,方法是删除内核、程序和所有对象文件。因此,当它继续尝试链接时,对象文件已被删除。删除删除文件的行,或将目标
clean:
放在前面的行上,或采取措施抵消造成的损害。@JonathanLeffler使用“复制”“粘贴”重新复制代码。通过删除rm-f core$(PROG)$(OBJS)行测试代码,它确实创建了3个受尊重的c文件的对象文件。如果您不介意解释的话,那么什么时候需要rm命令呢?我只是被简单地教了一下。