我有一个 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)
我真的想知道哪里出了问题?
有什么想法吗?
非常感谢。
在重新检查了与我在 stackoverflow 上的问题相关的所有答案后,我找到了答案马克·西伯恩 https://stackoverflow.com/users/443562/mark-seaborn质疑:__cxa_pure_virtual 的目的是什么? https://stackoverflow.com/questions/920500/what-is-the-purpose-of-cxa-pure-virtual解决了我的问题。
由于我的jni库是由autotools管理的,在Makefile.am的AM_LDFLAGS中添加“-Wl,--gc-sections -fPIC -shared -lstdc++”后问题解决了。如果代码由 C++ 编译器(例如 g++)编译,则 libstdc++ 可能不需要。
希望这可以帮助其他有同样问题的人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)