-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Android的JNI开发,使用两个基于ncnn的本地库时,运行出现 Fatal signal 6 (SIGABRT)错误 #976
Comments
@nihui 求大神解答,倒腾了一周没进展 ORZ |
合一个 |
@onexuan 两个动态库合并成一个,问题解决了。可能是本地动态库链接的问题,具体原因不知道··· |
不合并的话试试 strip 两个你的 so,看看能否解决。 |
请问有没有解决呢?我也遇到类似问题,尝试了自己编译ncnn库,感觉是和openmp有关 |
我把mtcnn、mfnet和ncnn编译成一个动态库后解决了,具体什么原因还不知道 |
遇到了同样的问题@_@ |
同样问题,有什么优雅的解决方案吗? |
必须分so的话,就不要用.a了,编译一个libncnn.so共用来解决相对优雅一点 |
你好,请问后面有其他解决方法吗,我被这个bug缠了好几天 |
可以参考 android/ndk#1028 的建议,修改 ld flags 老的ndk上尝试
新的ndk这样
|
@nihui,非常感谢,更新了ndk,加了ldflags果然成功了 |
你好,这个问题,我也遇到了,然后我使用了ndk r21,在ld flags里用了-fopenmp -static-openmp结果仍然不可用,单独调用也是可以的,麻烦能帮我详细说一下相关的配置么 |
同样的问题,一个工程包含2个编译so的module(都是使用ncnn的模块) ,单独跑哪个都没问题,2个一起跑就崩了,报错是(__kmp_abort_process+44),链接已经加上了 -fopenmp -static-openmp,还是老样子 |
@wangyangneu @zdx3145 生成每个.so库的时候,指定openmp.so的路径来链接openmp的动态库,我是这么解决的,希望可以帮到你。 |
我也碰到了类似的问题,最后讲两个jni的链接库改成一个。问题解决 |
如果是静态加载的ncnn.a,需要编译.a的时候就做修改,否则只修改so中的配置还是会报错 @zdx3145 |
@wangyangneu 请教一下,如何在编译.a的时候修改.. |
问下是怎么指定openmp.so的路径来链接openmp的啊,谢谢 |
最近在做一个 android 应用,需要提供两套 inference engine(NCNN 和 SNPE [闭源的 没法编译成一个库])。
|
Maybe I solved the problem. manually set the allocator with ncnn::PoolAllocator. eg: .... |
Maybe your Vulkan Lib version is so lower |
如果两个so同时使用一个ncnn.a,需要在编译ncnn.a的时候就加上-Wl,-Bstatic -lomp -Wl,-Bdynamic或者-fstatic-openmp |
@wangyangneu 您好,我也遇到了同样的问题,我用的是r15c版本的安卓ndk,貌似这个问题是两个动态库依赖同一个静态的libomp.a库导致的。希望指导一下,如何在编译ncnn.a的时候加上-Wl,-Bstatic -lomp -Wl,-Bdynamic, 不知道还有没有其他的解决办法。 |
的是r15c版本的安卓ndk,貌似这个问题是两个动态库依赖同一个静态的libomp.a库导致的。希望指导一下,如何在编译ncnn.a的时候加上-Wl,-Bstatic -lomp -Wl,-Bdynamic, 不知道还有没有其他的解决办法。 |
有加上-Wl,-Bstatic -lomp -Wl,-Bdynamic编好的ncnn.a供下载使用吗? |
遇到了一样的问题,这个问题是NCNN的还是Android NDK的又或是Android系统的? 同一套代码在最新的MIU 13 (22.3.21) 手机上就报这个错误,其他手机(华为、三星)都能正常运行。 完全不知道怎么解决,看大家描述是有两个NCNN实例的时候会报这个错,可是我只有一个so,在执行net.load_model() 的时候就崩溃了。 用的CMake,-fstatic-openmp加在那里???有没有朋友可以指导一下?
===更新=== |
求大佬解答,一模一样的问题 |
是在cmakelists中修改添加set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -fstatic-openmp")吗 |
ncnn加载两个动态库报错的问题怎么解决啊 可以帮忙说说吗 |
怎么分开加载两个so才不报错 你解决了吗 |
问下是怎么指定openmp.so的路径来链接openmp的啊,谢谢
这个问题怎么解决呢 加载两个so |
@liuxiaoxiao666 建议两个so依赖同一个libncnn.so,而不是分别静态链接libncnn.a。 如果非要静态链接两个libncnn.a,需要重新编译libncnn.a,在CMakeLists.txt中添加如下代码以静态链接openmp(但是貌似ncnn默认已经是静态链接openmp了?有点迷惑):
新版本ndk尝试:
之前实测ndk r21e还是第一种方法有效。 如果有其他链接了openmp的库,最好也要静态链接openmp。 |
用下载好的ncnn 我看只有libncnn.a,libncnn.so需要自己编译去生成libncnn.so吗
…------------------ 原始邮件 ------------------
发件人: ***@***.***>;
发送时间: 2022年9月22日(星期四) 下午5:36
收件人: ***@***.***>;
抄送: ***@***.***>; ***@***.***>;
主题: Re: [Tencent/ncnn] Android的JNI开发,使用两个基于ncnn的本地库时,运行出现 Fatal signal 6 (SIGABRT)错误 (#976)
@liuxiaoxiao666 建议两个so依赖同一个libncnn.so,而不是分别静态链接libncnn.a。
如果非要静态链接两个libncnn.a,需要重新编译libncnn.a,在CMakeLists.txt中添加如下代码以静态链接openmp(但是貌似ncnn默认已经是静态链接openmp了?有点迷惑):
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-Bstatic -lomp -Wl,-Bdynamic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bstatic -lomp -Wl,-Bdynamic")
新版本ndk尝试:
set_target_properties(target PROPERTIES COMPILE_OPTIONS -fopenmp) target_link_libraries( target -fopenmp -static-openmp)
之前实测ndk r21e还是第一种方法有效。
如果有其他链接了openmp的库,最好也要静态链接openmp。
—
Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
安卓项目中遇到了第三方人脸识别SDK(闭源)和ncnn+opencv中都链接了openmp,导致fatal crash,然后自己把源码下下来自己编译,把openmp off掉,解决了冲突问题,但对于多线程会有什么影响我没深究,总之能跑出结果不崩了,感谢作者(捂 |
#4370 修复 openmp affinity abort |
There are two steps to solve this problem
target_link_libraries( # Specifies the target library. |
老哥你解决了吗,我现在跟你的情况一模一样,也是在加载模型的时候就挂了,并且也是只有小米和红米的会挂,其他手机没事。唯一的区别是我用的mnn。我的两个so是依赖的同一个mnn的so,所以跟其他人的情况并不一样,但是我的场景是会并行,在两个线程里都会加载模型,所以也算是两个实例了。 |
JNI接口使用两个本地lib,分别编译成动态库mtcnn.so和mfnet.so。两个动态库都基于ncnn,且都链接了libncnn.a的静态库。
运行时,mtcnn功能正常,运行到mfnet时报错。尝试不加载mtcnn时(或者注释掉所有mtcnn的.load_param()方法),mfnet可以跑通,不报错。
另外我发现这并不一定时mfnet的问题,当我把mfnet的所有代码替换为mtcnn时(即mfnet.so和mtcnn.so相同),同样在运行第二个本地库时报错,且错误相同?
请问大神该如何解决?
AS的Logcat报错信息如下:
2017-08-05 19:25:41.912 20274-20274/com.example.dms A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 20274 (com.example.dms), pid 20274 (com.example.dms)
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: Build fingerprint: 'rockchip/rk3399pro/rk3399pro:8.1.0/OPM8.190305.001/101257:userdebug/test-keys'
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: Revision: '0'
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: ABI: 'arm64'
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: pid: 20274, tid: 20274, name: com.example.dms >>> com.example.dms <<<
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x0 0000000000000000 x1 0000000000004f32 x2 0000000000000006 x3 0000000000000008
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x4 0000007999fd6000 x5 0000007999fd6000 x6 0000007999fd6000 x7 00000000001c7ea0
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x8 0000000000000083 x9 0000000010000000 x10 0000007ff69ab5e0 x11 0000000000000001
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x12 0000000000000018 x13 00000003e8000000 x14 00364add5e425850 x15 00000f704fc4ba2b
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x16 00000059ddea0fa8 x17 000000799688752c x18 00000078fc6e5400 x19 0000000000004f32
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x20 0000000000004f32 x21 0000000000000083 x22 00000078fd3f0cea x23 00000079154e11d6
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x24 00000078fd3f0cee x25 00000078fd43a000 x26 000000791558964c x27 0000007ff69ab970
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x28 000000799a13fa40 x29 0000007ff69ab620 x30 000000799683c760
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: sp 0000007ff69ab5e0 pc 000000799683c788 pstate 0000000060000000
2017-08-05 19:25:41.999 20339-20339/? A/DEBUG: backtrace:
2017-08-05 19:25:41.999 20339-20339/? A/DEBUG: #00 pc 000000000001d788 /system/lib64/libc.so (abort+120)
2017-08-05 19:25:41.999 20339-20339/? A/DEBUG: #1 pc 000000000015e498 /data/app/com.example.dms-hnU3L7aK-rU0IqLRnkVVkg==/lib/arm64/libmfnet.so (__kmp_abort_process+44)
The text was updated successfully, but these errors were encountered: