我知道有几个这样的问题,到目前为止我找不到的答案似乎可以解决我的问题。
我正在使用 eclipse 。
我在main函数中编写了代码,并且工作正常。
然后,我将外部函数与主代码一起使用,现在我得到了一些有趣的错误。
#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的标记。
有人可以帮我吗?
编辑:我没有自觉地创建一个makefile,因为我说我正在使用eclipse。
同样,只要代码在main函数内部而不是createSaltandPepper()内部,代码也可以正常工作。
我的文件名为DisplayImage.cpp,上面的代码在此文件中,包括函数createSaltandPepper();。
该文件中仅有的两个函数是main函数和createSaltandPepper();。
项目中没有其他源文件。
如果遇到这么愚蠢的情况,我感到很抱歉:我是Java程序员,对makefiles等一无所知。
看这个截图:
现在,我创建了一个新项目并将我的旧文件添加到其中,这次将其命名为Display.cpp
“全部构建”在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文件。
更新:请注意,构建系统在文件级别上运行。它对功能等一无所知,仅源文件。也许这就是困惑的根源。
关于c++ - C++-没有规则来创建目标SaltPepper.o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434049/