cv::VideoCapture from string 在 Mac 上的 Qt5 中给出链接器错误

cv::VideoCapture from string gives linker error in Qt5 on Mac

本文关键字:错误 Qt5 链接 上的 from VideoCapture string Mac cv      更新时间:2023-10-16

>问题

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

当我用 int(0 表示 Mac 上的摄像机)调用它时,它工作正常:

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

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

但是:当我尝试使用 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 (苹果), 64 位)
  • Mac OSX 10.10.1
  • 从自制软件安装的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上发现了这个问题,这似乎与我的问题完全相同:链接错误:未定义对"cv::VideoCapture::open(std::string const&)"的引用

似乎我的问题可能与OpenCV版本的冲突有关。但是我检查了我的包含目录和我的 lib 目录,我似乎只安装了 2.4.9。Qt是否可能附带不同的版本?

我尝试将版本 2.4.9 直接包含在我的 .pro 文件中

LIBS += -lopencv_core2.4.9
...

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

阿拉伯数字。

我认为这可能与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版本有问题吗?

帮助

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

帕特里克

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

对于 OpenCV 3.0(也是 2.4.9 ?

您需要添加

LIBS += -lopencv_videoio

到 .pro,这是您的缺失。

经过几个小时的研究,我发现将QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.11添加到您的 .pro 文件中并删除以前的 .pro.user 文件和构建目录可以解决问题。第二步是必需的。

我在埃尔卡皮坦。