QT5在windows下調用OpenCV庫出現: undefined reference to `xxxxx' 錯誤解決辦法(適用MinGW編譯器)。

一、環境介紹

window系統:win10 X64

QT版本: 5.12

QT5.12自帶的MinGW編譯器版本:mingw730_32 與mingw730_64

在QT的安裝目錄下,可以查看MinGW編譯器的版本:

二、使用OpenCV出現的問題

在QT框架代碼裏使用老版本的分類器(cvLoad、cvHaarDetectObjects)處理圖像時,正常編譯沒有問題,當使用新版本級聯分類器(CascadeClassifier)時,程序編譯就會出現一堆沒有定義的錯誤:

release/widget.o:widget.cpp:(.text+0x2a1): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x465): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x631): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x63b): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
release/widget.o:widget.cpp:(.text+0x64b): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x66a): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
release/widget.o:widget.cpp:(.text+0x6c9): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x6de): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x6f9): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x786): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x796): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x7a4): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x7b3): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x7c6): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x7d4): more undefined references to `cv::Mat::deallocate()' follow
release/widget.o:widget.cpp:(.text+0x150b): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
release/widget.o:widget.cpp:(.text+0x151e): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x1540): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
release/widget.o:widget.cpp:(.text+0x15e1): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x15f2): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
release/widget.o:widget.cpp:(.text+0x1605): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x1627): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
release/widget.o:widget.cpp:(.text+0x1634): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x23a9): undefined reference to `cv::CascadeClassifier::CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x23b4): undefined reference to `cv::CascadeClassifier::CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x23bf): undefined reference to `cv::CascadeClassifier::CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x2458): undefined reference to `cv::CascadeClassifier::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
release/widget.o:widget.cpp:(.text+0x24f5): undefined reference to `cv::CascadeClassifier::~CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x2500): undefined reference to `cv::CascadeClassifier::~CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x250b): undefined reference to `cv::CascadeClassifier::~CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x25af): undefined reference to `cv::CascadeClassifier::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
release/widget.o:widget.cpp:(.text+0x268f): undefined reference to `cv::CascadeClassifier::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
release/widget.o:widget.cpp:(.text+0x280a): undefined reference to `cv::Mat::create(int, int const*, int)'
release/widget.o:widget.cpp:(.text+0x28b1): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
release/widget.o:widget.cpp:(.text+0x28c8): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x28f3): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
release/widget.o:widget.cpp:(.text+0x2907): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
release/widget.o:widget.cpp:(.text+0x291e): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
release/widget.o:widget.cpp:(.text+0x2939): undefined reference to `cv::equalizeHist(cv::_InputArray const&, cv::_OutputArray const&)'
release/widget.o:widget.cpp:(.text+0x29cb): undefined reference to `cv::CascadeClassifier::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>)'
release/widget.o:widget.cpp:(.text+0x2aac): undefined reference to `cv::ellipse(cv::Mat&, cv::Point_<int>, cv::Size_<int>, double, double, double, cv::Scalar_<double> const&, int, int, int)'
release/widget.o:widget.cpp:(.text+0x2acc): undefined reference to `cv::Mat::Mat(cv::Mat const&, cv::Rect_<int> const&)'
release/widget.o:widget.cpp:(.text+0x2b61): undefined reference to `cv::CascadeClassifier::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>)'
release/widget.o:widget.cpp:(.text+0x2bf6): undefined reference to `cv::CascadeClassifier::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>)'
release/widget.o:widget.cpp:(.text+0x2cce): undefined reference to `cv::circle(cv::Mat&, cv::Point_<int>, int, cv::Scalar_<double> const&, int, int, int)'
release/widget.o:widget.cpp:(.text+0x2d90): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x2ec0): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x2f42): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x2fc8): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text+0x3047): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x3057): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x3067): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x3077): undefined reference to `cv::Mat::deallocate()'
release/widget.o:widget.cpp:(.text+0x3094): undefined reference to `cv::CascadeClassifier::~CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x309f): undefined reference to `cv::CascadeClassifier::~CascadeClassifier()'
release/widget.o:widget.cpp:(.text+0x30aa): undefined reference to `cv::CascadeClassifier::~CascadeClassifier()'
release/widget.o:widget.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x64): undefined reference to `cv::fastFree(void*)'
release/widget.o:widget.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x71): undefined reference to `cv::Mat::deallocate()'
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [Makefile.Release:71: release/qt_opencv.exe] Error 1
mingw32-make: *** [Makefile:38: release] Error 2
mingw32-make[1]: Leaving directory 'D:/linux-share-dir/QT/build-qt_opencv-Desktop_Qt_5_12_6_MinGW_32_bit-Release'
21:11:46: 進程"C:\Qt\Qt5.12.6\Tools\mingw730_32\bin\mingw32-make.exe"退出,退出代碼 2 。
Error while building/deploying project qt_opencv (kit: Desktop Qt 5.12.6 MinGW 32-bit)
When executing step "Make"

三、解決辦法

方法1:  使用當前QT使用的MinGW編譯器,重新編譯一份OpenCV的源碼再使用。

方法2:  使用已經編譯好的MinGW版本OpenCV庫,直接調用。

既然已經有編譯好的MinGW庫,就不用麻煩自己再去編譯了,各種OpenCV對應的MinGW編譯器編譯的庫下載地址: https://github.com/huihut/OpenCV-MinGW-Build  。

由於我的源代碼裏使用了OpenCV3.x和2.X版本的很多函數,在OpenCV4.X裏已經不存在,爲了兼容代碼,我這裏下載OpenCV3.X版本的庫。

下載之後,將bin目錄加到系統的環境變量PATH裏,方便程序在運行時能夠找到對應的動態庫。

在QT的工程文件里加入OpenCV頭文件的路徑和庫路徑即可:

QT       += core gui
QT       += multimediawidgets
QT       += xml
QT       += multimedia
QT       += network
QT       += widgets
QT       += serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

#linu平臺的路徑設置
linux {
message('運行linu版本')
#添加opencv頭文件的路徑,需要根據自己的頭文件路徑進行修改
INCLUDEPATH+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/include\
             /home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv\
             /home/wbyq/work_pc/opencv-3.4.9/_install/install/include/opencv2

LIBS+=/home/wbyq/work_pc/opencv-3.4.9/_install/install/lib/libopencv_*
}

win32
{
    message('運行win32版本')
    #添加opencv頭文件的路徑,需要根據自己的頭文件路徑進行修改
    INCLUDEPATH+=C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include \
                 C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv \
                 C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/include/opencv2
    LIBS+=C:/OpenCV_3.4.7/OpenCV-MinGW-Build-OpenCV-3.4.7/x86/mingw/bin/libopencv_*.dll
}

RESOURCES += \
    image.qrc

清除之前編譯報錯的文件,再次編譯即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章