C++ - 没有创建目标的规则 SaltPepper.o

C++ - no rule to create target SaltPepper.o

我知道有几个这样的问题,到目前为止我找到的答案似乎没有解决我的问题。

我正在使用 eclipse。

我在主函数中编写了一些代码,它运行良好。 然后我使用主代码中的外部函数,现在我得到了有趣的错误。

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <random>
#include <ctime>
#include <cstdlib>

using namespace std;
using namespace cv;
void  createSaltandPepper();

int main(int argc, char** argv) {

 createSaltandPepper();
 return 0;

}

不,因为我不想再给出一个广泛的例子,这里是函数的外部:

void  createSaltandPepper() {
//mycode
}

至少看起来不是拼写错误

但是,错误是:

make all 
make: *** No rule to make target 'SaltPepper.o', needed by 'Display'. 

我确实想知道,如果我的函数名为 createSaltandPepper,为什么它会尝试创建一个名为 SaltPepper.o 的标签。

有人可以帮助我吗?

编辑:正如我所说,我正在使用 eclipse,我没有有意创建 makefile。 同样,只要代码在主函数内而不是在 createSaltandPepper() 内,它就可以正常工作。 我的文件叫DisplayImage.cpp,上面的代码在这个文件里,包括函数createSaltandPepper(); 此文件中仅有的两个函数是 main 函数和 createSaltandPepper(); 项目中没有其他源文件。

如果我觉得我很愚蠢,我很抱歉:我是一名 Java 程序员,对 makefile 等一无所知。

查看此屏幕截图:

我现在创建了一个新项目并将我的旧文件添加到其中,这次称之为 Display.cpp

"build all" 在 subdir.mk 中导致错误,内容为:

subdir.mk:18: recipe for target 'Display.o' failed
make: *** [Display.o] Error 1

构建的完整错误信息如下:

make all 
Building file: ../Display.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0-std=c++11 -MMD -MP  -MF"Display.d"     -MT"Display.d" -o"Display.o" "../Display.cpp"
subdir.mk:18: recipe for target 'Display.o' failed
g++: error: argument to ‘-fmessage-length=’ should be a non-negative  integer  
make: *** [Display.o] Error 1

更新

我切换到 Netbeans。 现在可以使用了。

首先,此错误与编译器无关,此错误消息是由构建系统产生的(make 在您的情况下)。基本上,eclipse 似乎调用 make,它找出文件之间的依赖关系以及哪些文件需要重新编译,然后调用编译器来编译它们。然后将每个 C++ 源文件编译为目标文件 .o(通常具有相同的名称:SaltPepper.cpp -> SaltPepper.o)。然后将所有目标文件与库链接在一起以形成最终的可执行文件。

此特定错误消息告诉您您的可执行文件被指定为依赖于目标文件 SaltPepper.o,但构建系统不知道如何生成它。很可能没有相应的 SaltPepper.cpp 文件。所以检查这样的文件是否存在。如果不是,请检查项目的设置(如果是手动创建的,则检查 Makefile)并查看是否正确指定了所有 cpp 文件名。您应该将所有带有代码的 cpp 文件添加到项目中,并删除所有无关的 cpp 文件。

更新:请注意,构建系统在文件级别运行。它对函数等一无所知,只知道源文件。也许这就是混乱的根源。