【问题标题】:"undefined symbol: __cxa_pure_virtual" error when loading library from java从 java 加载库时出现“未定义符号:__cxa_pure_virtual”错误
【发布时间】:2013-10-23 04:49:04
【问题描述】:

我有一个需要加载本机代码库的 Java 程序(通过 JNI 和 SWIG),但是当我尝试运行它时,出现如下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/local/lib/libmyapp_jni.so.0.0.0: /usr/local/lib/libmyapp_jni.so.0.0.0: undefined symbol: __cxa_pure_virtual
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at org.myapp.myapp.main(myapp.java:11)

通过使用 ldd -d /usr/local/lib/libmyapp_jni.so.0.0.0

$ldd -d /usr/local/lib/libmyapp_jni.so.0
    linux-vdso.so.1 =>  (0x00007ffffedfe000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007feacde2a000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007feacdc26000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007feacda0e000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007feacd7f8000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feacd42f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007feace5a2000)
undefined symbol: __cxa_pure_virtual    (/usr/local/lib/libmyapp_jni.so.0)
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE  (/usr/local/lib/libmyapp_jni.so.0)
undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE (/usr/local/lib/libmyapp_jni.so.0)
undefined symbol: _ZTVN10__cxxabiv121__vmi_class_type_infoE (/usr/local/lib/libmyapp_jni.so.0)
undefined symbol: _ZSt7nothrow  (/usr/local/lib/libmyapp_jni.so.0)
undefined symbol: __gxx_personality_v0  (/usr/local/lib/libmyapp_jni.so.0)

我真的很想知道哪里出错了?

有什么想法吗?

非常感谢。

【问题讨论】:

    标签: java java-native-interface shared-libraries


    【解决方案1】:

    在stackoverflow上重新检查了与我的问题相关的所有答案后,我通过以下方式找到了答案 Mark Seaborn 提问:What is the purpose of __cxa_pure_virtual? 解决了我的问题。

    由于我的 jni 库是由 autotools 管理的,在将“-Wl,--gc-sections -fPIC -shared -lstdc++”添加到 AM_LDFLAGS 后,Makefile.am 问题解决了。如果代码由 c++ 编译器(例如 g++)编译,则可能不需要 libstdc++。

    希望这可以帮助遇到同样问题的其他人。

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 2018-06-18
      • 1970-01-01
      • 2010-10-03
      • 2014-02-13
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2018-03-10
      相关资源
      最近更新 更多