Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将我的SWIG生成库所依赖的SWIG生成的共享库放入dlsym搜索中?_Java_C++_Shared Libraries_Swig_Ld - Fatal编程技术网

Java 如何将我的SWIG生成库所依赖的SWIG生成的共享库放入dlsym搜索中?

Java 如何将我的SWIG生成库所依赖的SWIG生成的共享库放入dlsym搜索中?,java,c++,shared-libraries,swig,ld,Java,C++,Shared Libraries,Swig,Ld,我使用的是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.PSEng

我使用的是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)

由于某种原因, LBYMyMy.Sux/Sux>不依赖于 LBPSeTeMang.g,所以或系统中的任何其他非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

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.的依赖性与其他部分有着奇怪的不同,只是包含了完整的路径

但是,这并不能解决查找问题,在我的环境中打开
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\u g.因此
根本不会出现在搜索中。为
java
命令设置
LD\u PRELOAD
以加载
libPSEngine\g。因此
不会更改搜索顺序中的任何内容


我完全被难住了。StackOverflow,你的智慧是什么?

在启动Java之前调整你的
LD\u库路径
。@ElliottFrisch我已经这样做了(参见第3段)。你是否尝试过使用SWIG为Java创建一个简单的Hello World示例,它只依赖于C运行时和Antlr3c。对我来说,Java搜索Antlr3c is/usr/local/lib有点奇怪。在启动Java之前,请调整
LD_LIBRARY\u路径。@ElliottFrisch我已经这样做了(参见第3段)。您是否尝试过使用SWIG为Java创建一个简单的Hello World示例,它只取决于C运行时和Antlr3c。对我来说,Java搜索Antlr3c is/usr/local/lib有点奇怪。
     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 [