构建快照包时,包装器脚本会自动将$SNAP/usr/lib
添加到LD_LIBRARY_PATH
。
在docker上构建我的包时,一些库(在本例中为liblapack
和libblas
)分别安装在子目录中:$SNAP/usr/lib/lapack
和$SNAP/usr/lib/libblas
。
虽然我的snapcraft.yaml中的stage-packages
下定义了所有依赖项,但上面的路径不包含在包装器脚本中。
如何强制snapcraft自动将所有库的路径添加到包装器脚本?
答案 0 :(得分:6)
Snapcraft维护公共库路径列表(例如/usr/lib/
,/usr/lib/<arch>
等)。如果存在这些目录,则会将它们添加到LD_LIBRARY_PATH
。想想Ubuntu如何在你提到的那些不可预测的路径中“找到”libs:这是/etc/ld.so.conf
背后的原因之一。但是,软件包通知Ubuntu的新库的典型方式是在安装Debian软件包之后运行的钩子中。在Snapcraft的情况下,那些挂钩永远不会运行 - 舞台包装只是打开包装。这意味着Snapcraft没有简单的方法来学习它刚刚解压缩的舞台包在一个不可预测的地方有一个库。
虽然Snapcraft目前无法自动为您提供帮助,但您可以使用以下两种方法之一自行完成此操作:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SNAP/usr/lib/lapack
,然后执行您实际想要运行的二进制文件。然后在apps
部分中使用该包装脚本。使用新的as yet undocumented environment
关键字,如下所示:
apps:
my-app:
command: my-binary
environment:
LD_LIBRARY_PATH: $LD_LIBRARY_PATH:$SNAP/usr/lib/lapack