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
如果他们以第二种方式完成,他们不会消灭Library
build设。 +中的加号非常重要。
如果你正在试图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(全部大写)