zoukankan      html  css  js  c++  java
  • Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')

    Android 中移植一个库(该库 使用了 libstlport )时 产生如下错误:

    ./obj/local/armeabi/objs/jniWrapper/native.o: In function `_Vector_base':
    D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h:73: undefined reference to `__cxa_end_cleanup'
    ./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt6vectorIhSaIhEEC1ERKS1_[std::vector<unsigned char, std::allocator<unsigned char> >::vector(std::vector<unsigned char, std::allocator<unsigned char> > const&)]+0x0): undefined reference to `__gxx_personality_v0'
    ./obj/local/armeabi/objs/jniWrapper/native.o: In function `std::__node_alloc::deallocate(void*, unsigned int)':
    D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h:161: undefined reference to `__cxa_end_cleanup'
    ./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt4priv12_String_baseIcSaIcEED2Ev[std::priv::_String_base<char, std::allocator<char> >::~_String_base()]+0x0): undefined reference to `__gxx_personality_v0'
    ./obj/local/armeabi/objs/jniWrapper/native.o: In function `basic_string':
    D:/opt/android-ndk/sources/cxx-stl/stlport/stlport/stl/_string.c:643: undefined reference to `__cxa_end_cleanup'
    • After reading android-ndk/docs/CPLUSPLUS-SUPPORT.html I found that there a couple more libraries that I can link to:

                   C++       C++   Standard
                Exceptions  RTTI    Library
      
      system        no       no        no
      gabi++        no      yes        no
      stlport       no      yes       yes
      gnustl       yes      yes       yes
      

      This stops my linker errors (and pushes the build onto a new set of errors :))

      Application.mk

      APP_STL := gnustl_static
      
    • Take a look here: Linux C++: Linker is outputting strange errors.

      In Android's Application.mk this would be:

      APP_CPPFLAGS := –frtti
    • You can fix this problem by adding the compiler option -lsupc++.

      Edited: The reason: your code is using C++ exception mechanism which compiler automatically generate try/catch/finally block hidden code which in turn call __cxa_end_cleanup somewhere. lsupc++ means link to libsupc++.a

      Another way to resolve this problem is add -fno-exceptions option to gcc which obviously means disable exception handler mechanism.

      BTW, you should also add -fno-rtti to avoid other maybe-encountered compilation error, this is because all android's C++ class is compiled without dynamic type info in class memory layout.

      In a word, you shoud use one of these option combos: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc++

    参考链接:http://quabr.com/9226513/linker-errors-in-android-ndk-undefined-reference-to-cxa-end-cleanup

  • 相关阅读:
    WCF Restful调用跨域解决方案
    [Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!
    人体呼吸信号的数据挖掘
    Spark编译及spark开发环境搭建
    诗两首------重庆项目出差有感
    eclipse安装和中文汉化,以及配置
    Querying CRM data with LINQ
    oracle pl/sql之在java中怎么调用oracle函数
    oracle pl/sql之oracle函数
    oracle pl/sql之java中调用oracle有参存储过程
  • 原文地址:https://www.cnblogs.com/klcf0220/p/7218238.html
Copyright © 2011-2022 走看看