gcc的makefile错误:“没有规则,使目标…”

我试图使用GCC(Linux)与一个生成文件来编译我的项目。

我得到以下错误,在这种情况下,似乎无法破译:

"No rule to make target 'vertex.cpp', needed by 'vertex.o'. Stop." 

这是makefile:

 a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o main.o: main.cpp main.h g++ -c main.cpp vertex.o: vertex.cpp vertex.h g++ -c vertex.cpp edge.o: edge.cpp edge.h g++ -c num.cpp vlist.o: vlist.cpp vlist.h g++ -c vlist.cpp elist.o: elist.cpp elist.h g++ -c elist.cpp vnode.o: vnode.cpp vnode.h g++ -c vnode.cpp enode.o: enode.cpp enode.h g++ -c node.cpp 

这通常是因为您没有可用的vertex.cpp文件。 检查:

  • 该文件存在。
  • 你做的时候你在正确的目录中。

除此之外,我没有其他build议。 也许你可以给我们一个该目录的目录列表。

根据我的经验,这个错误通常是由拼写错误引起的。

我今天得到这个错误。

使[1]:***没有规则,使目标maintenaceDialog.cpp', needed by maintenaceDialog.o'。 停止。

在我的情况下,错误只是一个拼写错误。 维护一词缺less第三个N.

另外检查你的文件名拼写。

打印此消息的更常见的原因是因为您忘记了包含源文件所在的目录。 结果,gcc“认为”这个文件不存在。

您可以使用-I参数将目录添加到gcc。

在我的情况下,我用骨头作逗号分隔符。 为了使用你的例子,我做了这个:

 a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o 

将其改为相当于

 a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o 

修复。

这是吗? 请记住,Makefile语法是可识别空白的,并且需要制表符才能在操作下缩进命令。

在我的情况下,这是由于在Makefile中的多行规则错误。 我有这样的东西:

 OBJS-$(CONFIG_OBJ1) += file1.o file2.o \ file3.o file4.o \ OBJS-$(CONFIG_OBJ2) += file5.o OBJS-$(CONFIG_OBJ3) += file6.o ... 

CONFIG_OBJ1规则中文件列表末尾的反斜杠导致了这个错误。 它应该是这样的:

 OBJS-$(CONFIG_OBJ1) += file1.o file2.o \ file3.o file4.o OBJS-$(CONFIG_OBJ2) += file5.o ... 

我发现的问题甚至比其他人提到的还要严重。

我们的makefiles通过了要build立的东西的清单。 有人将TheOtherLibrary添加到其中一个列表中,如下所示。

 LIBRARYDIRS = src/Library LIBRARYDIRS = src/TheOtherLibrary 

他们应该这样做:

 LIBRARYDIRS = src/Library LIBRARYDIRS += src/TheOtherLibrary 

如果他们以第二种方式完成,他们不会消灭Librarybuild设。 +中的加号非常重要。

如果你正在试图build立John the Ripper“bleeding-jumbo”,并得到一个像“make:*** No rule to make target'linux-x86-64'”的错误。 试试运行这个命令: ./configure && make

其中一个常见的错误可能是另一个文件名中的拼写错误

你的例子很简单,但有时可能会混淆的是make本身的信息。 让我们考虑一个例子。

我的文件夹内容是:

 $ ls -1 another_file index.md makefile 

而我的makefile看起来像

 all: index.html %.html: %.md wrong_path_to_another_file @echo $@ $< 

虽然我确实有index.md ,但是它的名字没有错, make的消息就是

 make: *** No rule to make target `index.html', needed by `all'. Stop. 

说实话, 这个信息是完全错误的 。 可以稍微改变makefile ,也就是说用明确的规则replace模式:

 index.html: index.md wrong_path_to_another_file 

现在我们得到的信息是:

 make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'. Stop. 

奇迹! 以下可能会得出结论:

  • make取决于规则,并不总是指出问题的根源

  • 您的makefile可能存在与此消息指定的不同的其他问题

现在我们已经提出了在规则检查其他依赖关系的想法:

 all: index.html %.html: %.md another_file @echo $@ $< 

只有这样才能为我们提供理想的结果:

 $ make index.html index.md 

当我只将Source目录复制到不同的位置时,我得到了同样的错误。

在我移动了Build目录后,它解决了。

在我的情况下,源和/或旧目标文件被半崩溃的IDE或从停止正常工作的备份云服务locking(只读)。 重新启动与文件夹结构关联的所有程序和服务解决了问题。

另一个奇怪的问题和解决scheme的例子:

这个:

 target_link_libraries( ${PROJECT_NAME} ${Poco_LIBRARIES} ${Poco_Foundation_LIBRARY} ${Poco_Net_LIBRARY} ${Poco_Util_LIBRARY} ) 

给出: make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop. make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

但是,如果我删除Poco_LIBRARIES它的作品:

 target_link_libraries( ${PROJECT_NAME} ${Poco_Foundation_LIBRARY} ${Poco_Net_LIBRARY} ${Poco_Util_LIBRARY} ) 

我在Mac上使用clang8,在Linux上使用clang 3.9这个问题只发生在Linux上,但是可以在Mac上使用!

我忘了提及: Poco_LIBRARIES是错的 – 它不是由cmake / find_package设置的!

我有一个被删除的function这个问题。 我在WBworkspace69.metadata.plugins目录中的几个元数据文件中find了对函数的引用。 我删除了这些元数据文件,问题就消失了。

就我而言,这是由于我调用Makefile:MAKEFILE(全部大写)