使用 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 构建时可见,使用系统默认目录中的包含)?

也许这将有助于将 aliba 拆分为不同的包,其中 a 构建依赖于 liba,但我不确定它是否有助于解决共享库安装问题。

您对这个问题有一些经验吗?有什么建议吗?感谢您的回答。

【问题讨论】:

【参考方案1】:

恐怕快照不太适合您想要做的事情。它们非常适合最终用户应用程序(例如,使 lib 在脚本中有用的包装器),但通过设计它们与系统的其余部分隔离。可以在其中提供库以供其他应用程序使用,但这些应用程序需要在 /snap/<snap name>/current/ 的某个位置查找库和标头,这绝对不在默认搜索路径上。

请注意,您可以通过快照发送库,以便通过content interface 在其他快照中使用。不过,我建议尽可能避免它;根据我的经验,它非常复杂和脆弱。

【讨论】:

我很害怕......

以上是关于使用 snap 安装共享库的主要内容,如果未能解决你的问题,请参考以下文章

CMake第三课--安装自己编写的头文件和共享库

oracle xe安装后debian共享库未正确加载

linux共享库安装后的设置

Automake:如何在不安装的情况下构建共享库

Linux 静态库和共享(动态)库的创建与使用详解

如何在没有共享库的情况下使用 GMP、MPFR、MPC、ELF 逐个安装 GCC?