使用 snap 安装共享库
Posted
技术标签:
【中文标题】使用 snap 安装共享库【英文标题】:Install shared library using snap 【发布时间】:2019-02-03 07:28:09 【问题描述】:我有一个项目,它是由 cmake 构建的,我想用 snap 打包。项目包括可执行文件和库(让我们调用 it a 和 liba)。
我的 snapcraft.yaml 文件看起来像:
name: a
version: "0.9"
summary: xyz
description: xyz
grade: devel # must be 'stable' to release into candidate/stable channels
confinement: strict
apps:
a:
command: a
parts:
a:
plugin: cmake
source: ./a.zip
filesets:
manpages: [ usr/share/man ]
在 CMake 中,a 依赖于 liba(实际上 a 只是 liba 的“包装器”在 bash 脚本中使用)。当我使用 Snapcraft 构建项目并安装该软件包(安装为 --dangerous)时,从终端运行命令 a 工作正常。但是当我尝试构建依赖于 liba 的应用程序(使用 gcc)时,我遇到了以“/usr/bin/x86_64-linux-gnu- ld: 找不到 -la" 错误信息。首先,我必须包含标题,即使它们已使用“-I/snap/a/current...”安装到系统默认的 include 目录中(我明白将安装文件快速安装到 /snap/ 目录中,但也许我只是对 snapcraft.yaml 做错了)。然后我从上面的 ld 收到消息。
我是 snap 包的新手,这是我的第一个项目。是否有可能将 liba 安装为系统库(使用 gcc 构建时可见,使用系统默认目录中的包含)?
也许这将有助于将 a 和 liba 拆分为不同的包,其中 a 构建依赖于 liba,但我不确定它是否有助于解决共享库安装问题。
您对这个问题有一些经验吗?有什么建议吗?感谢您的回答。
【问题讨论】:
【参考方案1】:恐怕快照不太适合您想要做的事情。它们非常适合最终用户应用程序(例如,使 lib 在脚本中有用的包装器),但通过设计它们与系统的其余部分隔离。可以在其中提供库以供其他应用程序使用,但这些应用程序需要在 /snap/<snap name>/current/
的某个位置查找库和标头,这绝对不在默认搜索路径上。
请注意,您可以通过快照发送库,以便通过content interface 在其他快照中使用。不过,我建议尽可能避免它;根据我的经验,它非常复杂和脆弱。
【讨论】:
我很害怕......以上是关于使用 snap 安装共享库的主要内容,如果未能解决你的问题,请参考以下文章