android - 如何在 Qt for Android 中使用/链接 OpenCV 3.4.1?
问题描述
我想在我的 Qt for Android 项目中使用 OpenCV 3.4.1,但我得到了构建错误,例如:
.../libopencv_core.a(system.cpp.o):system.cpp:function cv::HWFeatures::initialize(): error: undefined reference to 'android_getCpuFeatures'
.../libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): error: undefined reference to 'carotene_o4t::isSupportedConfiguration()'
.../libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): error: undefined reference to 'carotene_o4t::cmpGE(carotene_o4t::Size2D const&, unsigned char const*, int, unsigned char const*, int, unsigned char*, int)'
这里有完整的错误文件(对于 Stack Overflow 来说太大了)
这是我在 *.pro 文件中写的:
QT += core quick quickcontrols2 widgets
CONFIG += c++11 console
#...
OPENCVSDKNATIVE = $$PWD/3rdparty/opencv-3.4.1-android-sdk/sdk/native
INCLUDEPATH += $$OPENCVSDKNATIVE/jni/include
equals(ANDROID_TARGET_ARCH, armeabi-v7a) {
message("setting armeabi-v7a OPENCV libs")
# OPENCV LIBS
LIBS += -L"$$OPENCVSDKNATIVE/3rdparty/libs/armeabi-v7a" -llibtiff -llibjpeg -llibjasper -llibpng -llibwebp -lIlmImf -ltbb -ltegra_hal
LIBS += -L"$$OPENCVSDKNATIVE/staticlibs/armeabi-v7a" -lopencv_core -lopencv_imgcodecs -lopencv_imgproc
ANDROID_EXTRA_LIBS += $$OPENCVSDKNATIVE/libs/armeabi-v7a/libopencv_java3.so
}
以及我在 cpp 代码中输入的内容:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgcodecs/imgcodecs.hpp>
int main (int argc, char *argv[]){
QString imgPath = "path_to_my_image.jpg";
cv::Mat image = cv::imread(imgPath.toStdString().c_str());
//...
}
如何在 Qt for Android 中使用/链接 OpenCV 3.4.1?
使用的版本:
- 来自此处的适用于 Android 3.4.1 的 OpenCV SDK。
- Qt 5.10.1
- Qt 创作者 4.6.1
- 适用于 armeabi-v7a 的 Android(适用于 Android armv72 的 GCC 4.9、Qt 5.10.1)发布
编辑 1:我更新了 *.pro 文件中的 LIBS var,但仍然存在问题
LIBS +=\
-L"$$OPENCVSDKNATIVE/3rdparty/libs/armeabi-v7a"\
-L"$$OPENCVSDKNATIVE/staticlibs/armeabi-v7a"\
-llibtiff -llibjpeg -llibjasper -llibpng -lIlmImf -llibprotobuf\
-lopencv_core -lopencv_imgproc -lopencv_imgcodecs\
-ltbb -lcpufeatures -ltegra_hal
解决方案
LIBS
由于*.pro 文件中 var 的错误定义而出现问题。
这是一个有效的(我添加-lcpufeatures
并把库按好顺序)
LIBS +=\
-L"$$OPENCVSDKNATIVE/3rdparty/libs/armeabi-v7a"\
-L"$$OPENCVSDKNATIVE/staticlibs/armeabi-v7a"\
-lopencv_imgcodecs -lopencv_imgproc -lopencv_core -llibtiff -llibjpeg -llibjasper -llibpng -lIlmImf -llibprotobuf -llibwebp -ltbb -lcpufeatures -ltegra_hal
推荐阅读
- node.js - return 不会停止在请求中执行代码
- java - Janusgraph 库无法在 kerberos 环境中与 hbase 通信(无法指定服务器的 Kerberos 主体名称)
- jquery - 使用jquery根据数据属性中的最小值和最大值选择div
- sql - 在 SQL 中设置自定义请求标头,查询期望在标头中传递会话的 REST API
- gradle - 如何使用 -P 将命令行参数传递给 build.gradle 脚本并将该参数用作依赖包
- jquery - Photoshop 2015 扩展无法访问所有数组项
- django - 尽管模板文件夹中存在 Django 模板,但未找到它
- node.js - 使用 Puppeteer 拦截文档下载并提取 CSV 数据
- javascript - 调试显示更多显示更少按钮 - 缺少文本段落
- linux-kernel - 不同 ebpf 程序类型之间的地图共享