zoukankan      html  css  js  c++  java
  • 使用不同的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++静态支持库,问题解决后正确的运行路径:

  • 相关阅读:
    EasyNetQ使用(三)【Publish与Subcribe】
    EasyNetQ使用(二)【连接RabbitMQ,SSL连接,Logging】
    EasyNetQ使用(一)【介绍】
    .net core使用EasyNetQ做EventBus
    .NET Core微服务之开源项目CAP的初步使用
    CAP 介绍及使用【视频】
    .NET Core 事件总线,分布式事务解决方案:CAP
    微服务中的异步消息通讯
    使用 Metrics.net + influxdb + grafana 搭建项目自动化监控和预警方案
    编写高效的jQuery代码
  • 原文地址:https://www.cnblogs.com/bbqzsl/p/7372711.html
Copyright © 2011-2022 走看看