构建快照包时,包装程序脚本会自动将$SNAP/usr/lib添加到LD_LIBRARY_PATH

在docker上构建我的软件包时,一些库(在本例中为liblapacklibblas)分别安装在以下子目录中:$SNAP/usr/lib/lapack$SNAP/usr/lib/libblas

尽管所有依赖项都在我的snapcraft.yaml中的stage-packages下定义,但是上述路径未包含在包装脚本中。

如何强制snapcraft将所有库的路径自动添加到包装脚本?

最佳答案

Snapcraft维护一个常用库路径的列表(例如/usr/lib//usr/lib/<arch>等)。如果这些目录存在,它将把它们添加到LD_LIBRARY_PATH。想一想Ubuntu如何以您提到的那种不可预测的方式“找到” libs:这是/etc/ld.so.conf背后的原因之一。但是,软件包将新库通知Ubuntu的典型方式是在安装Debian软件包后运行的挂钩中。在Snapcraft的情况下,这些挂钩永远不会运行-阶段包装只是解包了。这意味着Snapcraft无法轻松地得知刚刚解压缩的Stage-Pack在不可预测的位置具有一个库。

尽管Snapcraft目前无法自动为您提供帮助,但您绝对可以使用以下两种方法之一自行完成此操作:


创建一个设置LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/usr/lib/lapack的包装器脚本,然后执行您实际要运行的二进制文件。然后在apps部分中使用该包装器脚本。
使用new和as yet undocumented environment关键字,如下所示:

apps:
  my-app:
    command: my-binary
    environment:
      LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/lib/lapack

09-04 22:29