Приложение QT не будет компилироваться при использовании OpenCV 4.2 - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать приложение с использованием OpenCV и QT, работая на основе создателя QT. Я использовал эту комбинацию в Visual Studio в прошлом без каких-либо проблем, но я начал использовать рабочую станцию ​​Linux в качестве основного окна разработки, поэтому перешел на QTCreator в качестве IDE.

Приложение получает данные по сети и отображает некоторые из них в виде изображения; все остальное работает нормально и проверено; это просто показывает изображение, которое вызывает проблему. Ошибка сборки возникает, когда я вызываю imshow:

Mat image = Mat(1944, 2592, CV_16U, (void*)images[imgCount].data());
imshow("disp", image);

И вывод сборки выглядит следующим образом (я сократил некоторые пути к файлам):

g++ -c -pipe -g -std=gnu++11 -Wall -Wextra -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I../RasPiRawImageReceiverTest -I. -isystem /usr/local/include/opencv4 -isystem /usr/include/qt -isystem /usr/include/qt/QtNetwork -isystem /usr/include/qt/QtCore -I. -I/usr/lib/qt/mkspecs/linux-g++ -o main.o ../RasPiRawImageReceiverTest/main.cpp
g++ -c -pipe -g -std=gnu++11 -Wall -Wextra -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I../RasPiRawImageReceiverTest -I. -isystem /usr/local/include/opencv4 -isystem /usr/include/qt -isystem /usr/include/qt/QtNetwork -isystem /usr/include/qt/QtCore -I. -I/usr/lib/qt/mkspecs/linux-g++ -o receiver.o ../RasPiRawImageReceiverTest/receiver.cpp
g++ -pipe -g -std=gnu++11 -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp
/usr/bin/moc -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB --include moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/QtCreatorProjects/RasPiRawImageReceiverTest -I/usr/local/include/opencv4 -I/usr/include/qt -I/usr/include/qt/QtNetwork -I/usr/include/qt/QtCore -I. -I/usr/include/c++/9.2.1 -I/usr/include/c++/9.2.1/x86_64-pc-linux-gnu -I/usr/include/c++/9.2.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.1/include -I/usr/local/include -I/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.1/include-fixed -I/usr/include ../receiver.h -o moc_receiver.cpp
g++ -c -pipe -g -std=gnu++11 -Wall -Wextra -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I../RasPiRawImageReceiverTest -I. -isystem /usr/local/include/opencv4 -isystem /usr/include/qt -isystem /usr/include/qt/QtNetwork -isystem /usr/include/qt/QtCore -I. -I/usr/lib/qt/mkspecs/linux-g++ -o moc_receiver.o moc_receiver.cpp
main.cpp: In function ‘int main(int, char**)’:
main.cpp:9:15: warning: unused variable ‘r’ [-Wunused-variable]
    9 |     Receiver* r = new Receiver();
      |               ^
g++  -o RasPiRawImageReceiverTest main.o receiver.o moc_receiver.o   -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_videoio -lopencv_imgcodecs -lopencv_flann /usr/lib/libQt5Network.so /usr/lib/libQt5Core.so -lpthread   
/usr/bin/ld: receiver.o: in function `Receiver::dataReady()':
receiver.cpp:52: undefined reference to `imshow(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cv::_InputArray const&)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:228: RasPiRawImageReceiverTest] Error 1
12:03:02: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project RasPiRawImageReceiverTest (kit: Desktop)
When executing step "Make"

OpenCV был составлен из стабильных исходных файлов 4.2.0, загружаемых с веб-сайта OpenCV и использующих конфигурацию CMake по умолчанию. QT 5.14.1 устанавливается из репозиториев Manjaro.

Из того, что я могу сказать, это несоответствие стандарту C ++, но, насколько я могу судить, и OpenCV, и приложение компилируются с C ++ 11. Файл QT .pro содержит строку CONFIG += c++11. Другие функции OpenCV работают; это просто кажется из того, что я проверял. Я знаю, что в сборке есть и другие предупреждения, но на данный момент это не проблема.

Редактировать: .pro выглядит так:

QT -= gui
QT += network

CONFIG += c++11 console
CONFIG -= app_bundle

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
        main.cpp \
        receiver.cpp

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

HEADERS += \
    receiver.h

INCLUDEPATH += \
          /usr/local/include/opencv4
          /usr/local/include

LIBS += \
        -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_videoio -lopencv_imgcodecs -lopencv_flann
...