dlopen failed: library “libomp.so“ not found

解决dlopen failed: library "libomp.so" not found


1.问题描述

Android NDK开发时,如果开启多线程加速,需要用到openMP库,一些版本的差异,会出现dlopen failed: library "libomp.so" not found的错误,即找到libomp.so库

解决方法有两种方式


2.解决方法1

解决思路也很粗暴,直接将NDK里libomp.so拷贝到src/main/jniLibs或者libs,即可解决问题。

比如我使用的是NDK版本是:android-ndk-r21e,在该目录下搜索libomp.so,

至于拷贝哪个处理器版本,需要根据你的平台选择,一般在abiFilters会指定 "armeabi-v7a", "arm64-v8a"平台,拷贝对应的版本即可;如果不存在,可以复制其他平台的libomp.so代替试试。

拷贝的目的地址,由jniLibs.srcDirs指定so库的位置:

jniLibs.srcDirs = [src/main/jniLibs, libs]

举个例子:

比如将【aarch64】里面的libomp库复制到项目src/main/jniLibs中的 "armeabi-v7a", "arm64-v8a"目录下(目录不存在,则新建),然后再运行测试(大部分手机都可以这么解决) 如果还不能正常运行,则复制【arm】或者其他平台的libomp.so代替试试

3.解决方法2(不推荐)

为了减小APK的大小,项目只适配了【"armeabi-v7a", "arm64-v8a" 】处理器架构库,这会导致部分手机不支持。build完成后,在app/build/intermediates/cmake/debug/obj可查看到已经编译且支持库;其中libomp.so可能因为一些差异导致没有生成或者没有找到

解决方法:

先删除之前build的中间产物:把app/.cxx和app/build目录都删除掉 注释掉app/build.gradle文件中:abiFilters "armeabi-v7a", "arm64-v8a" (这样就会生成所有处理器架构库,但打包APK会比较大) 重新build,run 重新查看app/build/intermediates/cmake/debug/obj,发现已经支持【"armeabi-v7a", "arm64-v8a","x86","x86_64"】等库
经验分享 程序员 微信小程序 职场和发展