【问题标题】:Resolve dependencies of paraview plugin解决 paraview 插件的依赖关系
【发布时间】:2018-02-28 08:58:06
【问题描述】:

我开始的情况是:

我在我的开发 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 库(到目前为止还有意义),但它无法找到。现在我应该承认,paraview 并没有真正安装在 linux 系统上,只是作为二进制分发下载。我知道 Linux 中常见的库搜索路径。我现在的问题是,这个插件是为一群用户开发的,我和我没有直接关系。他们会以某种方式下载 paraview 并让它运行。我不能依赖他们将二进制文件放入正确的路径来查找库。

有没有办法,如何将这些库与插件静态链接(尽管这完全违背了共享库的想法)?任何 Cmake 定义,我错过了吗?

我发现了这个类似的帖子here,但我真的无法利用它。

【问题讨论】:

  • Is there a way, how to statically link these libraries with the plugin - 您需要 静态库 才能静态链接它们。我不是 Paraview 专家,但 it seems 你可以使用 -DBUILD_SHARED_LIBS=OFF 选项到 cmake 使用静态库来构建它。
  • 感谢您的回复!我知道我可以用不同的方式编译 paraview 本身。但我需要我的插件与 paraview 版本一起使用,因为它是从网页提供的。
  • I need my plugin to work with the paraview version as it is supplied from the webpage. - 而且,据我了解您的情况,网页提供的 ParaView 可以在发展时更改,对吗?如果是这样,您需要链接动态库,并且应该在客户 PC 上找到这些库。这意味着,如果客户将库放入非系统目录,他/她应该调整环境变量以便可以找到这些库。这种情况在任何图书馆都很常见。

标签: cmake shared-libraries paraview


【解决方案1】:

我同时想出了解决上述问题的方法:

毕竟,缺少库只是一种症状。我确实使用他们网页https://gitlab.kitware.com/paraview/paraview-superbuild 中的超级构建脚本编译了 paraview,但仍然没有成功。编译与网页中的二进制文件一起使用的插件的关键是使用相同的编译器版本(可能还有 libc 等)。

我确实使用 PV_PLUGIN_DEBUG 变量对插件进行故障排除,结果发现它在调试输出期间崩溃了。显然,paraview 试图跳转到某些地址来调用一些自省函数(例如返回一个插件依赖项列表,在我的例子中恰好是一个空字符串),但是在这个地址没有找到函数。

简而言之:您需要使用 devtools-4 软件包获取 CentOS 6 来编译 paraview(以获取库和包含)和您的插件。然后事情突然按其应有的方式工作。

【讨论】:

  • 我遇到了和你一样的问题。只有在我的情况下,我的插件有一个 libvtknetcdf 依赖项,它在二进制 paraview 版本中不存在。我使用-DENABLE_qt5-DENABLE_python 构建了paraview superbuild。您在 paraview 编译中使用了哪些标志?
  • 我使用了 ccmake,并且我将 ENABLE_Qt5、ENABLE_paraviewsdk、ENABLE_netcdf 和 ENABLE_vtkm 设置为打开。这会在 install/lib 目录中生成一个 libnetcdf.so 和一个 libvtkm_cont.so。这对你有帮助吗?
  • 如果我使用ENABLE_qt5ENABLE_paraviewsdk 会弹出错误消息Please use a system qt5 or disable qt5 to enable SDK deployment!。我选择了qt5,看看是否可行。
  • 正确,USE_SYSTEM_qt5 也开启了。然后我确实将 -DQt5_DIR=path_to_qt 传递给了 cmake。这实际上可能只在第一次调用 cmake 或 ccmake 时起作用。如果是这样,您必须在重新运行之前删除 CMakeCache.txt 和 CMakeFiles。
【解决方案2】:

根据编译的方式,有几种不同的方法可以让它工作。

我的第一个建议是尝试在启动 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 作为第一个选项。

【讨论】:

    【解决方案3】:

    这并非不可能,但您需要以与官方二进制文件完全相同的方式构建 ParaView,并使用完全相同的编译器、服务、包等。这是确保您的插件与“官方”二进制文件一起运行所必需的。

    理想情况下,ParaView 将提供一个 SDK,您可以根据该 SDK 构建可与官方二进制文件一起使用的插件,但这不可用。在 SDK 可用之前(未知 ETA),您需要打包并提供您自己的 ParaView 二进制文件以使您的插件工作。 ParaView superbuild 使这相当容易。见https://gitlab.kitware.com/paraview/paraview-superbuild。或者您可以查询 paraview-developers@paraview.org 邮件列表,了解平台和 ParaView 版本的确切构建配置,并尝试复制构建。

    【讨论】:

      猜你喜欢
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多