cv::VideoCapture from string 在 Mac 上的 Qt5 中给出链接器错误
cv::VideoCapture from string gives linker error in Qt5 on Mac
>问题
我正在尝试让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 文件和构建目录可以解决问题。第二步是必需的。
我在埃尔卡皮坦。
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 可能的Qt5错误:调用setFixedSize()禁用主窗口的关闭按钮(在Win7下)
- Qt5 C++中出现意外"Multiple definition"错误
- C++ Qt5 QDir重命名返回错误
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- QPushButton 错误在 QT5 下,同时推动在 macOS 上进入全屏
- 链接QT5库会自动将额外的FPIC标志传递给NVCC编译器,并通过cmake Cause错误
- Qt5:错误:“qt_metacall”不是 的成员
- 链接 Qt5.6 会产生找不到所需引用的错误
- QT5对QinputDialog和Qmessagebox的未识别引用.错误
- 在 qt5 中使用 QSharedPointer 时出现 Seg 错误
- VBA 中的 Qt5 Dll,错误运行时错误 453
- Qt5 - 尝试创建登录页面时"undefined reference"错误
- 使用QT5上的对象指针上使用QRegisterMetate类型会引发未解决的错误
- 将C++11程序链接到CMake中的Qt5会导致错误
- 查找损坏的共享库错误(QT5 C )的原因
- 为什么在使用QT5时收到以下错误
- Qt5:错误:'WA_LockPortraitOrientation'不是'Qt'的成员
- 错误:Qt5视频渲染错误代码80040218
- ::write()和::read()没有被声明为错误.Qt5 UNIX信号处理