我有一个Java应用程序,它使用JNI与本机代码交互。本机代码在运行时编译一个文件,并尝试使用dlopen调用加载此文件。此呼叫失败,我收到一条警告,说明
Could not load library (x):(x) undefined symbol: y
然而,当我让一个本机应用程序通过JNI启动JVM时,运行相同的代码,这个错误不会发生,它会按预期运行。我怀疑Java做了一些奇特的事情,导致已经加载的库对于使用dlopen加载的库是不可见的。
我这样做是为了诊断问题:
- 使用
objdump
确认本应未定义的符号位于哪个共享库中 - 已确认使用
gdb
加载了该库(通过eclipse-该库已在模块窗格中列出) - 在dlopen之前打印LD_LIBRARY_PATH,并确认Java通过它(它确实添加了Java的lib目录,但原始目录仍然存在)
我已经尝试解决这个问题有一段时间了,但我不知道发生了什么。特别是因为当JVM从本机应用程序加载时,它确实有效。
提前谢谢!
-Wl,--export-dynamic
链接器标志未找到的符号的共享库。
有趣的是,我自己并没有对共享库进行编程,我希望默认编译添加标志,因为使用它的软件需要它才能正常工作。
不管怎样,它都是一个开源项目,所以我可以使用适当的标志集编译它。