使用G++编译openCV后,G++返回错误

3
我正在尝试运行一个包含openCV库且创建了一个简单Mat的C++文件。但是,当我使用g++编译文件时,会返回一系列错误。
到目前为止,我已经尝试删除Mat定义,并仅包含openCV文件,这样可以正常工作!由于我刚接触命令行,所以我不确定是否是我使用g++的方式有问题。然而,我在Xcode中已经很多地方使用过openCV(尽管在Xcode中,没有必要在命令行中工作,因为一切都会在运行时整齐地构建)。
此外,这是我第一次发布到Stack Overflow,所以我可能已经格式化错误。
这是我想要编译的main.cpp文件。如我之前所提到的,如果我删除“Mat test;”这行代码,它就可以编译成功并按预期写入控制台。
#include <iostream>
#include <string>

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/videoio.hpp>


using namespace std;
using namespace cv;

int main() {
        Mat test;
        cout << "Mat Defined!" << endl;
        return(0);
}

这是我正在使用的g++命令:
g++ -o main.out main.cpp

当我尝试运行它时,会出现以下错误:

/usr/bin/ld: /tmp/ccbbhoNd.o: in function `cv::Mat::~Mat()':
main.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): undefined reference to `cv::fastFree(void*)'
/usr/bin/ld: /tmp/ccbbhoNd.o: in function `cv::Mat::release()':
main.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x68): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status

非常感谢任何帮助。我还选择关闭了g++的冗长标志,因为它返回了大量代码行,我不确定人们对50多行代码的看法如何。非常感谢!

2
你还需要链接OpenCV库。你可能需要在g++命令的末尾添加类似于-lopencv的内容。 - Cris Luengo
2个回答

3

您遇到了与链接OpenCV库相关的问题。 您需要向ld程序传递信息,以便找到所有必要的库。 在您的情况下,它将是:

g++ -I/usr/local/include/opencv -I/usr/local/include/opencv2 -L/usr/local/lib/ -o main.out  main.cpp -lopencv_core

所有OpenCV的链接标志为:

-lopencv_calib3d
-lopencv_contrib
-lopencv_core
-lopencv_features2d
-lopencv_flann
-lopencv_highgui
-lopencv_imgproc
-lopencv_legacy
-lopencv_ml
-lopencv_nonfree
-lopencv_objdetect
-lopencv_photo
-lopencv_stitching
-lopencv_superres
-lopencv_ts
-lopencv_video
-lopencv_videostab

我建议你在C++项目中使用CMake构建系统。使用OpenCV编译程序会更容易。请查看文档。CMake将为您准备包含所有必需依赖项的makefile。

最好的问候!


非常感谢您的帮助!明天我会尝试这些! - Thomas Rimer

2

这个失败是因为你在命令中没有链接库。编译过程中,由于你没有引用opencv库,操作系统无法访问它们。你需要使用下面的代码编译cpp文件:

g++ -std=c++11 main.cpp `pkg-config --libs --cflags opencv` -o output

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接