使用不同的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的更多相关文章
- DCMTK3.6.1(MD支持库)安装说明
转载:http://qimo601.iteye.com/blog/1685135 [前言] 最近,因为需要开发DICOM网管模块,必须使用DCMTK的DcmNet模块.但是DCMTK3.6.0在Dcm ...
- DCMTK3.6.0(MD支持库)安装说明
一.运行环境:WIN7 32bit + VisualStudio2008 + dcmtk3.6.0 + Cmake2.8.8 或者 WIN7 64bit 二.准备工作: 1)MD/MT的知识储备: / ...
- 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView
本文主要介绍如下三个Android支持库控件的配合使用: TabLayout:android.support.design.widget.TabLayout ViewPager:android.sup ...
- 配置php支持gd函数模块
配置php支持gd函数模块 今天在联系上线源码包tttuangou 的时候,出现了对gd_info和imagecreatefromjpeg模块缺失的提示,我丈二和尚摸不着头脑,决定彻底学习一番 什么是 ...
- 解析库-beautifulsoup模块
# -*- coding: utf-8 -*- from bs4 import BeautifulSoup # 安装:pip install beautifulsoup4 # Beautiful So ...
- 爬虫----爬虫解析库Beautifulsoup模块
一:介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...
- Android 支持库迁移到AndroidX
一.背景 Android系统版本在不断更新,从最初的Android 1.0到现在Google和各大手机厂商正在推的Android 10,平均下来每个年头都有一个大的版本更新.但用户正在用的手机上的An ...
- 你应该知道的4个DSP开发支持库
引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些算法支持库,对于加快dsp开发进程与提高代码质量.稳定性有非常大的帮助. Digital ...
- Android百分比布局支持库介绍——com.android.support:percent(转)
转载自http://www.apkbus.com/forum.php?mod=viewthread&tid=244752&extra=&_dsign=0b699c42 在此之前 ...
随机推荐
- 浅谈K-means聚类算法
K-means算法的起源 1967年,James MacQueen在他的论文<用于多变量观测分类和分析的一些方法>中首次提出 “K-means”这一术语.1957年,贝尔实验室也将标准算法 ...
- POJO和JavaBean
1.POJO POJO(Plain Ordinary Java Object):POJO就是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean.EntityBean等, ...
- 设计模式(十)Strategy模式
Strategy模式,就是用来整体地替换算法,可以轻松地以不同的算法解决同一个问题. 还是根据一个示例程序来理解这种设计模式吧.先看一下示例程序的类图. 然后看示例程序代码. package bigj ...
- django-模板之with标签(十二)
就是给传过来的值取个别名.
- vue表单和组件使用
表单: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...
- fenby C语言 P27使用指针
使用指针 p代表地址 *p代表这个地址存放的内容 #include <stdio.h> int main(){ int x=100,y=200,*p1=&x,*p2=&y; ...
- Linux读取外存
Linux系统不像Windows系统那样,U盘自动识别,即插即用,Linux需要手动挂载U盘.步骤如下: 1.查看闪存: fdisk -l 2.添加挂载目录,一般放在/mnt下 mkdir /mnt/ ...
- 如何用好redis pipeline
编者注:pipeline是Redis的一个提高吞吐量的机制,适用于多key读写场景,比如同时读取多个key的value,或者更新多个key的value.工作过程中发现挺多小伙伴都对pipeline多少 ...
- Unity5-ABSystem(一):AssetBundle原理
转载自:http://blog.csdn.net/lodypig/article/details/51863683 说明 AssetBundle简介 AssetBundle内部格式 normal bu ...
- centos7 搭建ftp 并配置用户目录
1.如果是阿里云服务器,登录控制后台,配置规则,开启21端口 (sftp是加密文件传输使用的22端口,我们这几是搭建ftp服务器) 2.安装配置vsftp服务器 一.配置防火墙,开启FTP服务器需要的 ...