来自string的cv :: VideoCapture在Mac上的Qt5中提供了链接器错误

时间:2015-01-14 13:26:37

标签: c++ macos qt opencv linker

问题

我正在尝试在Qt项目中运行OpenCV VideoCapture类。

当我用 int (我的mac上的摄像机为0)调用它时,它运行正常:

#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
...
cv::VideoCapture cap(0);

项目编译,当我运行时,我的相机上的灯亮了。

BUT:当我尝试使用 std :: string 作为参数进行编译时,我收到链接器错误:

#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
...
cv::VideoCapture cap("/Users/xxxxx/small.mp4");

结果:

Undefined symbols for architecture x86_64:
  "cv::VideoCapture::VideoCapture(std::string const&)", referenced from:
  MainWindow::MainWindow(QWidget*) in mainwindow.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

虽然 std :: string 的构造函数应该存在: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-videocapture

设置

我的规格:

  • Qt 5.4.0(Clang 6.0(Apple),64位)
  • Mac OSX 10.10.1
  • 从homebrew安装的OpenCV 2.4.9

我的.pro文件:

QT       += core gui widgets

TARGET = VideoCaptureTest
TEMPLATE = app

SOURCES += main.cpp mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

INCLUDEPATH += /usr/local/include

LIBS += -L/usr/local/lib
LIBS += -lopencv_core
LIBS += -lopencv_imgproc
LIBS += -lopencv_highgui
LIBS += -lopencv_ml
LIBS += -lopencv_video
LIBS += -lopencv_videostab
LIBS += -lopencv_features2d
LIBS += -lopencv_calib3d
LIBS += -lopencv_objdetect
LIBS += -lopencv_contrib
LIBS += -lopencv_legacy
LIBS += -lopencv_flann

我尝试了什么

1

我在SO上发现了这个问题,这似乎与我的问题完全相同: Linking error: undefined reference to `cv::VideoCapture::open(std::string const&)`

看起来我的问题可能与OPC版本的OpenCV有关。但我检查了我的include目录和我的lib目录,我似乎只安装了2.4.9。 Qt可能有不同的版本吗?

我尝试使用

直接在我的.pro文件中包含版本2.4.9
LIBS += -lopencv_core2.4.9
...

但是我如何确保在源文件中也包含此版本?

2

我虽然可能与Mac和x86_64有关。我在.pro文件中包含了以下几行,我在网上找到了这些行:

CONFIG += x86 ppc x86_64 ppc64
CONFIG += MAC_CONFIG

MAC_CONFIG {
     QMAKE_CXXFLAGS = -std=c++11 -stdlib=libstdc++ -mmacosx-version-min=10.7
     QMAKE_LFLAGS = -std=c++11 -stdlib=libstdc++ -mmacosx-version-min=10.7
}

但这也没有效果。

3

这里(http://answers.opencv.org/question/14772/solved-linking-error-undefined-reference-to-cvvideocaptureopenstdstring-const/)建议尝试 cv :: String 而不是 std :: string 。我也试过这个:

#include "opencv2/opencv.hpp"
...
cv::String s("/Users/xxxxx/small.mp4");
cv::VideoCapture cap(s);

奇怪的是我仍然得到完全相同的错误:

Undefined symbols for architecture x86_64:
  "cv::VideoCapture::VideoCapture(std::string const&)", referenced from:
  MainWindow::MainWindow(QWidget*) in mainwindow.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

似乎 cv :: String 实际上转换为 std :: string ,我猜是因为编译器在某处找到了构造函数的定义 std :: string ,但链接器没有?

4

显然OSX 10.9存在类似的问题,而不是cv :: VideoCapture,但通常导致x86_64的链接错误。解决方案是包括

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9
<。>在.pro文件中。我也尝试了10.9和10.10(我实际上正在使用)。还是一样的错误。这可能是我的OSX版本的问题吗?

帮助

我没有找到关于如何解决问题的其他建议。有人知道我做错了什么吗?任何帮助表示赞赏!

帕特里克

2 个答案:

答案 0 :(得分:4)

答案已在链接的讨论(@wezside)中给出(说明的第1项)。

for OpenCV 3.0(也是2.4.9?)

你需要添加

LIBS += -lopencv_videoio

到.pro,你的遗失了。

答案 1 :(得分:-1)

经过几个小时的研究后,我发现将private void label1_TextChanged(object sender, EventArgs e) { //You can use any logic here, //for example you can check if(label1.Text=="something") this.checkBox1.Checked = false; } 添加到.pro文件中,删除以前的.pro.user文件和构建目录可以解决问题。第二步是必需的。

我在El Capitan。