使用不同的C++支持库的模块混合开发时,引发异常展开不正常,抛异常竟引出一个SIGSEGV

Posted bbqz007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用不同的C++支持库的模块混合开发时,引发异常展开不正常,抛异常竟引出一个SIGSEGV相关的知识,希望对你有一定的参考价值。

如果你使用gcc对一部分模块进行了GNUMake的编译,这些编译出动态库使用在Gradle编译框架下的项目。那么就有可能出现题目中的情况,使用不同的C++支持库的模块混合开发时,引发异常展开不正常。

当我们使用GNUMake编译的项目进行移植编译时,都会使用Ndk的toolchains下对应的gcc进行编译,并且链接到对应的c++支持库。但是Gradle(或者说android Studio)默认使用clang,并且执意链接到llvm对应的libc++支持库。

以我的情况为例子,我选用了Ice-3.7进行移植编译,工具为ndk-gcc以及gnustl,Ice-3.7对llvm和stlport的支持有点不兼容。

而我的开发项目使用android studio 2.3以后的版本的c++ support功能进行开发。而gradle即使结合了cmake,但已经完全的偏向了llvm(clang)。尽管费周折在build.gradle修改cmake对应参数,使cmake去使用gcc而不是clang,但是似乎依然忽略我的cppflags \'-std=gnu++11\',由gradle生成的native动态库却依赖 libc++.so。致使下面的情况

native.so ==> libc++.so

               ==> Ice.so

Ice.so ==> libgnustl_shared.so

但是实际运行中,Ice.so 里面异常相关的符号 __cxa_*** 链到了 native.so , 而 __gnu_UnWind*** 链到了 libc++.so。却不是libgnustl_shared.so。

这样一来,运行中当Ice.so里面抛出的异常进入了libc++.so,从而引起了SIGSEGV异常,真让人崩溃,如果你没明白的话,我就被崩溃了一日。

解决方法自然就是让Ice.so的异常相关的函数链接到libgnustl支持库上,既然无法解决运行动态加载,那就用libgnustl_static.a好了。这样做后,问题解决。

让人崩溃的异常函数链接错误:

使用c++静态支持库,问题解决后正确的运行路径:

以上是关于使用不同的C++支持库的模块混合开发时,引发异常展开不正常,抛异常竟引出一个SIGSEGV的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式 Python3 在导入本地模块时引发异常

C#:捕获混合托管/非托管进程的所有错误/异常

使用不同版本的 Android 支持库的解决方法

简单上手nodejs调用c++(c++和js的混合编程)

xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持

xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持