C “生成文件错误”;“没有制定目标的规则”;如何解决?

C “生成文件错误”;“没有制定目标的规则”;如何解决?,c,gcc,makefile,C,Gcc,Makefile,我的makefile怎么了 CC = gcc OBJS = main.o map.o extended_map.o election.o utilities.o EXEC = election DEBUG_FLAG = -DNDEBUG COMP_FLAG = -std=c99 -Wall -pedantic-errors -Werror $(EXEC) : $(OBJS) $(CC) $(DEBUG_FLAG) $(OBJS) -o $@ main.o: main.c map.h e

我的makefile怎么了

CC = gcc
OBJS = main.o map.o extended_map.o election.o utilities.o
EXEC = election
DEBUG_FLAG = -DNDEBUG
COMP_FLAG = -std=c99 -Wall -pedantic-errors -Werror

$(EXEC) : $(OBJS)
    $(CC) $(DEBUG_FLAG) $(OBJS) -o $@
main.o: main.c map.h election.h test_utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
map.o: map.c map.h utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
extended_map.o: extended_map.c extended_map.h map.h utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
election.o: election.c election.h map.h extended_map.h utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
utilities.o: utilities.c utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
clean:
    rm -f $(OBJS) $(EXEC)
我正在linux上运行以下命令:

-bash-4.2$ ls
election.c  extended_map.c  main.c  makefile  mtm_map           utilities.c
election.h  extended_map.h  main.o  map.h     test_utilities.h  utilities.h
-bash-4.2$ make
make: *** No rule to make target `map.c', needed by `map.o'.  Stop.
-bash-4.2$

map.c存在于当前文件夹中名为
mtm\u map
的文件夹中

您告诉make如何用“map.c”构建“map.o”,但您没有“map.c”。您有“mtm_map/map.c”

你可能想要像这样的东西

CC = gcc
OBJS = main.o mtm_map/map.o extended_map.o election.o utilities.o
EXEC = election
DEBUG_FLAG = -DNDEBUG
COMP_FLAG = -std=c99 -Wall -pedantic-errors -Werror

$(EXEC) : $(OBJS)
    $(CC) $(DEBUG_FLAG) $(OBJS) -o $@
main.o: main.c map.h election.h test_utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
mtm_map/map.o: mtm_map/map.c map.h utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
extended_map.o: extended_map.c extended_map.h map.h utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
election.o: election.c election.h map.h extended_map.h utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
utilities.o: utilities.c utilities.h
    $(CC) -c $(DEBUG_FLAG) $(COMP_FLAG) $*.c
clean:
    rm -f $(OBJS) $(EXEC)

makefile希望
map.c
位于当前文件夹中,而不是子目录中。我已回滚您的编辑。在你的问题按照服务条款发布后,在这里污损它是不合适的。请不要再这样做了。请不要通过破坏你的帖子为别人做更多的工作。通过在Stack Exchange(SE)网络上发布,您已经在a下授予SE分发内容的不可撤销权利(即,无论您未来的选择如何)。根据SE政策,分发非故意破坏版本。因此,任何故意破坏行为都将恢复原状。请参阅:。如果允许删除,在帖子下方左侧有一个“删除”按钮,但它仅在浏览器中,而不是移动应用程序中。mod消息:post locked。锁定期结束后,请不要再回滚。我不知道更改$*.c是什么意思,但更改配方的内容无法解决您的问题。Make不关心配方的内容;它只是把它交给外壳。为了解决您的问题,您必须更改目标和先决条件,如图所示。@Chad Miller为您提出的问题提供了解决方案,该解决方案适用于该问题。现在你问了一个与第一个问题无关的问题。因此,它并不打算成为一个“运行教程课程”。它的目的是,你首先尝试解决你的问题,然后如果你不能,你可以发布一个关于这个特定问题的问题,描述你尝试了什么,什么不起作用。例如,在您上面的评论中,您说“一个新错误”,但您没有告诉我们编译失败的源文件。很可能您需要将
-I$(CURDIR)
添加到编译行(
COMP\u标志
变量),以便编译器可以找到您的头文件。他的代码确实有效,在这种情况下,以前没有制定目标规则的问题现在就不存在了。问题解决了。现在你有了一个新的不同的问题,那就是你的编译失败了,因为它找不到头文件。我们无法预见这个新问题,因为它取决于所有源文件的内容、它们包括什么以及如何包含。对于包含要包含的头文件的每个目录,需要使用
-I
编译器标志一次。如果它们都在一个目录中,您只需要在该目录中使用一次。编译器不会搜索整个系统(甚至当前目录的子目录)来查找文件。你必须告诉它它们在哪里。