c++ - 使用 OpenCV 4.2 时无法编译 QT 应用程序
问题描述
我正在尝试使用 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 已从可从 OpenCV 网站下载的 4.2.0 稳定源文件编译并使用默认的 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
解决方案
推荐阅读
- r - 如何合并观察的极值点并仅选择主导单位?
- sql - 如何在链接数据库中使用子查询
- python - 为什么“get_rect()”不适用于列表?
- flutter - Flutter:动态初始路由
- redis - '(error) ERR Error running script (call to ...)' 当使用 LUA 脚本的 --eval 时
- c# - 使用 ProcessExecution 依次启动 2 个应用程序
- gcc - RISC-V:未链接的目标文件中的代码大小
- apache - 如何修复 RewriteRule RewriteMap 语法
- flutter - 寻找提供者上下文的颤振问题
- css - 如何缩写 CSS 路径?