Reputation: 25
I've been struggling with making OpenCV work with Qt, but for some reason isn't it able to recognize OpenCV libraries. I've already tried nearly all the tutorials on stackoverflow, but for some reason it does not work.
The error message i get is.
10:50:36: Running steps for project test...
10:50:36: Configuration unchanged, skipping qmake step.
10:50:36: Starting: "/usr/bin/make"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -mmacosx-version-min=10.7 -Wl,-rpath,/Users/me/Qt/5.4/clang_64/lib -o test.app/Contents/MacOS/test main.o mainwindow.o moc_mainwindow.o -F/Users/me/Qt/5.4/clang_64/lib -L/usr/local/lib -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL
Undefined symbols for architecture x86_64:
"cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:
MainWindow::MainWindow(QWidget*) in mainwindow.o
"cv::Mat::deallocate()", referenced from:
cv::Mat::release() in mainwindow.o
"cv::imread(std::string const&, int)", referenced from:
MainWindow::MainWindow(QWidget*) in mainwindow.o
"cv::imshow(std::string const&, cv::_InputArray const&)", referenced from:
MainWindow::MainWindow(QWidget*) in mainwindow.o
"cv::fastFree(void*)", referenced from:
cv::Mat::~Mat() 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)
make: *** [test.app/Contents/MacOS/test] Error 1
10:50:37: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project test (kit: Desktop Qt 5.4.0 clang 64bit)
When executing step "Make"
10:50:37: Elapsed time: 00:00.
this is my .pro file
#-------------------------------------------------
#
# Project created by QtCreator 2015-01-23T19:58:31
#
#-------------------------------------------------
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test
TEMPLATE = app
INCLUDEPATH += /usr/local/include
HEADERS += mainwindow.h
LIBS += -L/usr/local/lib
-lopencv_core
-lopencv_imgcodecs
-lopencv_highgui
-lopencv_imgproc
SOURCES += main.cpp\
mainwindow.cpp
FORMS += mainwindow.ui
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
std::cout << "hello world - lalala" << std::endl;
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
cv::Mat inputImage = cv::imread("/users/horse.jpg");
cv::imshow("test",inputImage);
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>797</width>
<height>525</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>350</x>
<y>330</y>
<width>113</width>
<height>32</height>
</rect>
</property>
<property name="text">
<string>done</string>
</property>
</widget>
<widget class="QGraphicsView" name="input">
<property name="geometry">
<rect>
<x>50</x>
<y>70</y>
<width>256</width>
<height>192</height>
</rect>
</property>
</widget>
<widget class="QGraphicsView" name="output">
<property name="geometry">
<rect>
<x>490</x>
<y>70</y>
<width>256</width>
<height>192</height>
</rect>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>797</width>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menuOpenCV">
<property name="title">
<string>OpenCV</string>
</property>
</widget>
<addaction name="menuOpenCV"/>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>
Upvotes: 1
Views: 339
Reputation: 25
I found the solution to my problem
https://qt-project.org/forums/viewthread/35646
I solve this by change
/Users/ObiWang/Qt5.2.0/5.2.0-rc1/clang_64/mkspecs/macx-clang/qmake.conf
from QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6 to
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 Then there is no error message.
only 10.9 works ( 10.6, 10.7, and 10.8 all failed )
Upvotes: 1
Reputation: 1722
I see two possible problems:
In the .pro file:
LIBS += -L/usr/local/lib
--> Are openCV libs within this directory? (Otherwise try to add the directory of openCV libs with another -L flag)
From the compilation error:
ld: symbol(s) not found for architecture x86_64
Could it be, that you have the 32-bit versions of the library, instead of the 64-bit version? (You can check using the file command: e.g. file opencv_core.so .)
Upvotes: 0