java - 如何将我的 SWIG 生成的库所依赖的这个 SWIG 生成的共享库用于搜索 dlsym?
问题描述
我使用的是 Ubuntu 16.04、g++ 5.4.0 和 CMake 3.5.1,但我在 macOS Mojave 上的结果与最新的 XCode 版本一致。
我有一个带有 SWIG 模块的程序 MyModule,它依赖于一个由一堆 C++ 库和它自己的 SWIG 模块 PSEngine 组成的系统。当我尝试运行加载 PSEngine 的 MyModule Java 程序时,我收到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: psengine.PSEngineInterfaceJNI.swig_module_init()V
at psengine.PSEngineInterfaceJNI.swig_module_init(Native Method)
at psengine.PSEngineInterfaceJNI.<clinit>(PSEngineInterfaceJNI.java:356)
at psengine.PSEngine.makeInstance(PSEngine.java:59)
at MyModule.Main.main(Main.java:19)
最终,我的问题是:为什么 dlsym 不搜索libPSEngine_g.so
符号,我怎样才能让它看起来在那里?我接下来的旅程和我尝试过的事情如下。
LD_LIBRARY_PATH
指向包含 的目录libPSEngine_g.so
,我使用 . 将同一目录传递给 Java -Djava.library.path
。我通过在 处设置断点仔细检查了它正在寻找的符号dlsym
,并确认它正在寻找的 C++ 符号是这样的:
Java_psengine_PSEngineInterfaceJNI_swig_1module_1init
该符号出现在libPSEngine_g.so
:
$ nm libPSEngine_g.so | grep PSEngineInterfaceJNI_swig_1module
000000000005f2e1 T Java_psengine_PSEngineInterfaceJNI_swig_1module_1init
出于某种原因,libMyModule.so
它不依赖于libPSEngine_g.so
它应该依赖的系统中的任何其他非 SWIG C++ 库:
$ ldd libMyModule.so
linux-vdso.so.1 => (0x00007fffd56a9000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fa6b1d60000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa6b1990000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa6b1680000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa6b2400000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fa6b1450000)
这是 MyModule 中的初始链接条目CMakeLists.txt
:
swig_link_libraries(${PROJECT}
"PSEngine${EUROPA_SUFFIX}"
"System${EUROPA_SUFFIX}"
"Resource${EUROPA_SUFFIX}"
"Solvers${EUROPA_SUFFIX}"
"NDDL${EUROPA_SUFFIX}"
"TemporalNetwork${EUROPA_SUFFIX}"
"RulesEngine${EUROPA_SUFFIX}"
"ConstraintEngine${EUROPA_SUFFIX}"
"Utils${EUROPA_SUFFIX}"
"TinyXml${EUROPA_SUFFIX}"
)
起初我认为这是我在使用“较新”(不到 8 年的)链接器链接 SWIG 库时看到的一个问题,并且它不包括来自的符号,libPSEngine_g.so
因为libMyModule.so
实际上没有提到这些符号。我尝试强制它在链接中未定义,以诱使链接器定义符号:
swig_link_libraries(${PROJECT}
"-Wl,-u,${PSENGINE_SYMBOL}"
"PSEngine${EUROPA_SUFFIX}"
"System${EUROPA_SUFFIX}"
"Resource${EUROPA_SUFFIX}"
"Solvers${EUROPA_SUFFIX}"
"NDDL${EUROPA_SUFFIX}"
"TemporalNetwork${EUROPA_SUFFIX}"
"RulesEngine${EUROPA_SUFFIX}"
"ConstraintEngine${EUROPA_SUFFIX}"
"Utils${EUROPA_SUFFIX}"
"TinyXml${EUROPA_SUFFIX}"
)
但是,这只是在 中留下了未定义的符号libMyModule.so
。那不是问题。一堆谷歌搜索出现了一堆可能的链接器选项,包括--no-as-needed
,--export-dynamic
和--no-copy-dt-needed-entries
. 其中,产生我正在寻找的依赖的唯一一个是--no-as-needed
:
swig_link_libraries(${PROJECT}
"-Wl,--no-as-needed"
"PSEngine${EUROPA_SUFFIX}"
"System${EUROPA_SUFFIX}"
"Resource${EUROPA_SUFFIX}"
"Solvers${EUROPA_SUFFIX}"
"NDDL${EUROPA_SUFFIX}"
"TemporalNetwork${EUROPA_SUFFIX}"
"RulesEngine${EUROPA_SUFFIX}"
"ConstraintEngine${EUROPA_SUFFIX}"
"Utils${EUROPA_SUFFIX}"
"TinyXml${EUROPA_SUFFIX}"
)
给我链接命令:
/usr/bin/c++ -fPIC -shared -o libMyProject.so CMakeFiles/MyProject.dir/MyProjectJAVA_wrap.cxx.o -Wl,--no-as-needed /home/miatauro/workspace/my_project/europa/dist/europa/libPSEngine_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libSystem_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libResource_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libSolvers_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libANML_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libNDDL_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libTemporalNetwork_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libRulesEngine_g.so /usr/local/lib/libantlr3c.so /home/miatauro/workspace/my_project/europa/dist/europa/libPlanDatabase_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libConstraintEngine_g.so /home/miatauro/workspace/my_project/europa/dist/europa/libUtils_g.so -ldl /home/miatauro/workspace/my_project/europa/dist/europa/libTinyXml_g.so -Wl,-rpath,/home/miatauro/workspace/my_project/europa/dist/europa:/usr/local/lib
这会产生依赖项:
$ ldd libMyModule.so
linux-vdso.so.1 => (0x00007fffddb15000)
/home/miatauro/workspace/my_project/europa/dist/europa/libPSEngine_g.so (0x00007f1f52720000)
libSystem_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libSystem_g.so (0x00007f1f524f0000)
libResource_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libResource_g.so (0x00007f1f51f47000)
libSolvers_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libSolvers_g.so (0x00007f1f51b61000)
libANML_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libANML_g.so (0x00007f1f517c0000)
libNDDL_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libNDDL_g.so (0x00007f1f5142b000)
libTemporalNetwork_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libTemporalNetwork_g.so (0x00007f1f5111a000)
libRulesEngine_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libRulesEngine_g.so (0x00007f1f50e30000)
libantlr3c.so => /usr/local/lib/libantlr3c.so (0x00007f1f50c10000)
libPlanDatabase_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libPlanDatabase_g.so (0x00007f1f50692000)
libConstraintEngine_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libConstraintEngine_g.so (0x00007f1f501f8000)
libUtils_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libUtils_g.so (0x00007f1f4ff60000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1f4fd30000)
libTinyXml_g.so => /home/miatauro/workspace/my_project/europa/dist/europa/libTinyXml_g.so (0x00007f1f4fb10000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1f4f780000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1f4f460000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1f4f240000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1f4ee70000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1f52c00000)
依赖libPSEngine_g.so
项与其他依赖项奇怪地不同,仅包含完整路径。
但是,这并不能解决查找问题,并且LD_DEBUG=all
在我的环境中打开它在查找相关符号时会产生以下结果:
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libSystem_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libANML_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libResource_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libSolvers_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libNDDL_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libTemporalNetwork_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libRulesEngine_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libPlanDatabase_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libConstraintEngine_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libUtils_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/home/miatauro/workspace/my_project/europa/dist/europa/libTinyXml_g.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/lib/x86_64-linux-gnu/libgcc_s.so.1 [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/usr/local/lib/libantlr3c.so [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/lib/x86_64-linux-gnu/libm.so.6 [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/lib/x86_64-linux-gnu/libdl.so.2 [0]
18673: symbol=Java_psengine_PSEngineInterfaceJNI_swig_1module_1init; lookup in file=/lib64/ld-linux-x86-64.so.2 [
libPSEngine_g.so
根本没有出现在搜索中。加载命令的设置不会改变搜索顺序中的任何内容LD_PRELOAD
。java
libPSEngine_g.so
我完全被难住了。StackOverflow,你的智慧是什么?
解决方案
推荐阅读
- angular - 垫表服务器端分页和过滤数据的问题
- php - 在网上尝试了很多答案后,我在 Laravel 中上传的图像不显示。我上传的所有图片都可以存储,但它们不显示
- android - React native 未检测到 Android Studio
- azure - 如何使用 Azure DevOps 自动部署 Azure Database for PostgreSQL
- python - 如何在 Python 中处理没有扩展名的文件
- vue.js - vue-chart-3:在饼图中显示百分比值
- python - python 在给定辅助df的情况下替换数据框中的cols值。# 检查重复 KeyError:
- php - PHP 客户端库中的 Elasticsearch 函数评分功能
- html - 将 iFrame 中的网页内容限制为特定 URL
- python - Python:将包含行号的列添加到 MySQL 数据库