Android项目集成OpenCV遇.so版本后缀报错:原因与解决方法?
Android打包OpenCV时版本化库文件报错问题
问题详情
我从源码编译了OpenCV,CMake配置如下:
set(OpenCV_DIR "/home/ivelin/opencv/release") find_package( OpenCV REQUIRED ) include_directories( ${OpenCV_INCLUDE_DIRS} ) target_link_libraries(${OpenCV_LIBS})
打包Android APK时触发以下错误:
Generating Android Package Input file: /home/ivelin/Desktop/SecureMe/smart-client/android-secureme-deployment-settings.json Output directory: /home/ivelin/Desktop/SecureMe/smart-client/android-build/ Application binary: secureme Android build platform: android-34 Install to device: No The bundled library lib/libopencv_core.so.409 doesn't end with .so. Android only supports versionless libraries ending with the .so suffix. make[2]: *** [CMakeFiles/secureme_make_apk.dir/build.make:71: CMakeFiles/secureme_make_apk] Error 12 make[1]: *** [CMakeFiles/Makefile2:121: CMakeFiles/secureme_make_apk.dir/all] Error 2 make: *** [Makefile:91: all] Error 2
我已存在libopencv_core.so符号链接(指向libopencv_core.so.409),但错误依然存在,需要明确原因和修复方案。
错误原因
- Android APK打包工具会扫描编译输出目录下所有库文件,包括带版本号的
.so.*文件,即便存在无版本号的符号链接,工具仍会将版本化库纳入打包列表,而Android系统不允许APK的lib/目录中存在这类带后缀的库文件。 - 源码编译OpenCV时默认生成带版本号的库文件和对应符号链接,但CMake的Android打包流程未自动过滤这些版本化文件。
修复方案
方案1:重新编译OpenCV生成无版本号库
编译OpenCV时添加CMake参数,禁用版本号生成:
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DOPENCV_SKIP_VERSION=ON /path/to/opencv/source
或在OpenCV的CMakeLists.txt中直接设置:
set(OPENCV_SKIP_VERSION ON)
编译完成后,输出目录只会生成libopencv_core.so这类无版本号的库文件,不会产生.so.409这类版本化文件。
方案2:在项目CMake中过滤版本化库
无需重新编译OpenCV,在你的项目CMake配置中做两处修改:
- 手动指定要链接的无版本号OpenCV库,避免
find_package自动引入版本化库:# 替换为你实际需要的OpenCV模块 set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui) target_link_libraries(secureme ${OpenCV_LIBS}) - 添加规则排除打包时的版本化库文件:
if(ANDROID) set(CMAKE_ANDROID_PACKAGE_EXCLUDE_LIBS "${CMAKE_ANDROID_PACKAGE_EXCLUDE_LIBS};*.so.*") endif()
方案3:手动清理打包目录
打包前,将libopencv_core.so等无版本号的库(或符号链接)复制到Android项目的lib/<abi>目录下,同时删除所有带版本号的.so.*文件,确保打包工具不会扫描到这些文件。
内容的提问来源于stack exchange,提问作者Ивелин Иванов
相关产品推荐
相关产品推荐

