这种情况,我从:
开始我在我的开发PC上编译了paraview而没有任何问题。 然后我为它编译了一些小插件 - 再次出现问题。 如果我在该PC上运行paraview(我的编译版本或网页上的二进制文件),我可以加载并使用该插件。
问题:
我找不到办法,如何使用paraview二进制文件让插件在其他计算机上运行。
当我在插件.so文件上运行ldd时,它告诉我它找不到随二进制文件提供的paraview库列表:
libvtkPVClientServerCoreCore-pv5.4.so.1 => not found
libvtkCommonExecutionModel-pv5.4.so.1 => not found
libvtkCommonDataModel-pv5.4.so.1 => not found
libvtkClientServer-pv5.4.so.1 => not found
libvtkCommonCore-pv5.4.so.1 => not found
显然,插件依赖于paraview libaries(到目前为止有意义),它无法找到。现在我应该承认,那个paraview并没有真正安装在linux系统上,而只是作为二进制发行版下载。我很清楚Linux中常见的库搜索路径。我现在的问题是,这个插件是由一群用户开发的,我没有直接关系。他们会以某种方式下载paraview并让它运行。我不能依赖它们将二进制文件放入正确的路径来查找库。
有没有办法,如何将这些库与插件静态链接(尽管这完全违背了共享库的想法)?任何Cmake定义,我都错过了?
我发现了这个类似的帖子here,但我无法真正利用它。
答案 0 :(得分:1)
我同时找到了解决上述问题的方法:
毕竟,遗失的图书馆只是一种症状。我使用他们的网页https://gitlab.kitware.com/paraview/paraview-superbuild中的superbuild脚本编译了paraview,仍然没有成功。编译与网页中的二进制文件一起使用的插件的关键是使用相同的编译器版本(可能还有libc等)。
我确实使用PV_PLUGIN_DEBUG变量对插件进行故障排除,以发现它在调试输出期间崩溃了。显然,paraview试图跳转到某些地址来调用一些内省函数(例如返回一个插件依赖项列表,在我的情况下碰巧是一个空字符串),但是在这个地址找不到函数。
简而言之:你需要使用 devtools-4 包来获得 CentOS 6来编译paraview(以获取库和包含)和你的插件。然后事情就会突然发挥作用。
答案 1 :(得分:0)
根据编译方式,有一种不同方法可以使它工作。
我的第一个建议是尝试在你要启动Paraview的shell中设置LD_LIBRARY_PATH变量。您已经知道包含它尝试加载的库的目录,因此在启动Paraview之前运行命令export LD_LIBRARY_PATH=\path\to\libs:$LD_LIBRARY_PATH
。
其次,您可以覆盖二进制文件中包含的rpath以指向共享库的位置。最好的方法是使用patchelf。他们的网页向您显示了如何在此处执行此操作:https://github.com/NixOS/patchelf。然而,这会修改二进制文件,所以我仍然建议将LD_LIBRARY_PATH作为第一个选项。
答案 2 :(得分:0)
这不是不可能的,但是你需要使用与完全相同的编译器,服务,包等完全相同的方式构建ParaView。这是确保你的插件与&#34一起运行所必需的。 ;官方"二进制文件。
理想情况下,ParaView会提供一个SDK,您可以根据该SDK构建可与官方二进制文件一起使用的插件,但这是不可用的。在SDK可用(没有已知的ETA)之前,您需要打包并提供自己的ParaView二进制文件以使您的插件正常工作。 ParaView superbuild使这相当容易。见https://gitlab.kitware.com/paraview/paraview-superbuild。或者您可以查询paraview-developers@paraview.org邮件列表,了解平台和ParaView版本的确切构建配置,并尝试复制构建。