"未定义符号:__ cxa_pure_virtual"从Java加载库时出错 [英] "undefined symbol: __cxa_pure_virtual" error when loading library from java

查看:240
本文介绍了"未定义符号:__ cxa_pure_virtual"从Java加载库时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a Java program that needs to load a native code library (through JNI with SWIG) but when I tried to run it I got an error as follows:

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

by using 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)

我真的想知道哪里出了问题吗?

I really wonder where went wrong?

有什么想法吗?

非常感谢.

推荐答案

重新检查了与我关于stackoverflow问题的所有答案之后,我通过以下方式找到了答案 马克·西博恩提问:

After rechecking all the answers related to my question on stackoverflow, I found out the answer by Mark Seaborn to question: What is the purpose of __cxa_pure_virtual? fixed my problem.

由于我的jni库是由自动工具管理的,因此在Makefile.am的AM_LDFLAGS中添加了"-Wl,-gc-sections -fPIC -shared -lstdc ++"之后,问题就解决了.如果代码是由c ++编译器(例如g ++)编译的,则可能不需要libstdc ++.

As my jni library is managed by autotools, after adding "-Wl,--gc-sections -fPIC -shared -lstdc++" to AM_LDFLAGS of Makefile.am problems solved. libstdc++ might not necessary if code is compiled by a c++ compiler (e.g. g++).

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

Hope this could help others who have the same problem.

这篇关于"未定义符号:__ cxa_pure_virtual"从Java加载库时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆