码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-08-16 12:26:52      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:忽略   share   ges   使用   符号   win   lag   结合   toolchain   

如果你使用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

标签:忽略   share   ges   使用   符号   win   lag   结合   toolchain   

原文地址:http://www.cnblogs.com/bbqzsl/p/7372711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!