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

C++ cv::VideoCapture from string在Mac上的Qt5中给出链接器错误 问题,c++,macos,qt,opencv,linker,C++,Macos,Qt,Opencv,Linker,我试图让OpenCV VideoCapture类在Qt项目中运行 当我在mac上用int 0为摄像机调用它时,它工作正常: #include "opencv2/opencv.hpp" #include <opencv2/highgui/highgui.hpp> ... cv::VideoCapture cap(0); 虽然std::string中的构造函数实际上应该存在: 设置 我的规格: Qt 5.4.0 Clang 6.0苹果64位 Mac OSX 10.10.1 从自制软件

我试图让OpenCV VideoCapture类在Qt项目中运行

当我在mac上用int 0为摄像机调用它时,它工作正常:

#include "opencv2/opencv.hpp"
#include <opencv2/highgui/highgui.hpp>
...
cv::VideoCapture cap(0);
虽然std::string中的构造函数实际上应该存在:

设置 我的规格:

Qt 5.4.0 Clang 6.0苹果64位 Mac OSX 10.10.1 从自制软件安装的OpenCV 2.4.9 My.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
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
}
我试过的 1. 我发现这个问题与我的问题完全一样:

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

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

LIBS += -lopencv_core2.4.9
...
但是如何确保在源文件中也包含此版本

2. 我想这可能与Mac和x86_64有关。我在我的.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
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. 这里建议尝试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版本的问题吗

帮助 关于如何解决这个问题,我没有找到其他建议。有人知道我做错了什么吗?感谢您的帮助


帕特里克

答案已在discussion@wezside您描述的链接项1的

对于OpenCV 3.0和2.4.9

您需要添加

LIBS+=-lopencv\u视频


在你的.pro文件中找不到它。

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


我在El Capitan

你的头应该在/usr/local/include/opencv2/中,如果你想检查头是否适合库版本,如果不适合,我想他们可能会得到不同的链接名称。虽然我不认为我有不同版本的OpenCV:我怎么知道头有什么版本?库文件都有指向2.4.9.dylib文件的符号链接,这一点很清楚。但是标题呢?