如何在Qt for Android中链接并使用OpenCV 3.4.1?
解决Qt for Android中OpenCV 3.4.1的链接错误问题
看起来你遇到的是静态库链接时的依赖缺失+顺序问题,我来帮你一步步搞定:
首先,先拆解你遇到的两个核心错误:
undefined reference to 'android_getCpuFeatures':这个函数属于Android官方的cpufeatures库,你之前的配置里虽然加了这个库,但链接顺序不对导致没生效undefined reference to 'carotene_o4t::xxx':这些是OpenCV针对ARMv7架构做的硬件优化函数,来自carotene_o4t库,你完全没在配置里添加这个依赖
静态库的链接顺序非常重要——链接器是从左到右解析符号的,如果库A依赖库B,那B必须放在A的后面,不然会出现符号找不到的问题。
修改后的.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") # 先设置库的搜索路径 LIBS += -L"$$OPENCVSDKNATIVE/3rdparty/libs/armeabi-v7a" LIBS += -L"$$OPENCVSDKNATIVE/staticlibs/armeabi-v7a" # 链接顺序:先放OpenCV的核心库(它们依赖后面的第三方库),再放依赖库 LIBS += -lopencv_core -lopencv_imgproc -lopencv_imgcodecs LIBS += -llibtiff -llibjpeg -llibjasper -llibpng -llibwebp -lIlmImf -llibprotobuf LIBS += -ltbb -lcarotene_o4t -lcpufeatures -ltegra_hal # 动态库配置保持不变 ANDROID_EXTRA_LIBS += $$OPENCVSDKNATIVE/libs/armeabi-v7a/libopencv_java3.so }
关键修改说明
- 新增
carotene_o4t库:这个库就是你错误里缺失的硬件优化库,OpenCV 3.4.1的armeabi-v7a静态库目录下默认就有libcarotene_o4t.a,一定要加上 - 调整链接顺序:把OpenCV的核心库(
opencv_core等)放在最前面,因为它们依赖后面的tbb、cpufeatures这些库,这样链接器才能正确找到依赖的符号 - 确保
cpufeatures生效:虽然你之前加了这个库,但因为顺序不对没起作用,现在放在依赖链的最后,就能被正确解析了
额外要检查的点
- 确认你的OpenCV SDK的
staticlibs/armeabi-v7a目录下确实存在libcarotene_o4t.a,如果没有的话,可能是你下载的SDK包不完整,重新下载一次就行 - 确保你的Qt Android Kit配置的NDK版本和OpenCV 3.4.1兼容——OpenCV 3.4.1推荐用NDK r14b到r17c版本,Qt 5.10.1默认的NDK版本刚好在这个范围内,应该没问题
- 如果你切换到Debug模式编译,记得要对应使用
staticlibs/armeabi-v7a/debug下的静态库,不过你当前是Release版本,不用管这个
这样修改后,重新编译项目,应该就能解决那些链接错误了。
内容的提问来源于stack exchange,提问作者Jena43
相关产品推荐
相关产品推荐

