C++ cv::VideoCapture from string在Mac上的Qt5中给出链接器错误 问题
我试图让OpenCV VideoCapture类在Qt项目中运行 当我在mac上用int 0为摄像机调用它时,它工作正常: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 从自制软件
#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文件的符号链接,这一点很清楚。但是标题呢?