我有一个 C++ 二进制应用程序,我将它打包到我的 Ubuntu 20.04 上的“deb”包中。这个“deb”包有几个我定义的依赖项:
$ dpkg -I my-package-1.0.0.deb
new Debian package, version 2.0.
...
Package: my-package
Version: 1.0.0
Architecture: amd64
Depends: libfreetype6,libgcc-s1,libgl1,libglew2.1,libglvnd0,libglx0,...
...
这个包运行良好,除非我尝试在 Ubuntu 18.04 上安装它:
$ sudo dpkg -i my-package-1.0.0.deb
Selecting previously unselected package my-package.
(Reading database ... 198305 files and directories currently installed.)
Preparing to unpack my-package-1.0.0.deb ...
Unpacking my-package (1.0.0) ...
dpkg: dependency problems prevent configuration of my-package:
my-package depends on libgcc-s1; however:
Package libgcc-s1 is not installed.
my-package depends on libglew2.1; however:
Package libglew2.1 is not installed.
这些错误包(libgcc-s1、libglew2.1)在 Ubuntu 18.04 中不存在或存在但版本不同。因此,我有一个普遍的问题:是否可以创建与多个版本的 Ubuntu 兼容的“deb”包?如何 ?或者唯一的解决方案是为每个版本的 Ubuntu(以及每个其他 Linux 发行版)构建一个包?当存在依赖项时,构建“deb”包最常用的策略是什么?
打开终端并输入: 在 Ubuntu 18.04 中,将 my-package-1.0.0.deb 文件复制到您的桌面。打开终端并输入:
上述命令也适用于所有当前支持的 Ubuntu 版本。这是一个幸运的情况。一般来说,不要期望一组魔法命令适用于所有当前支持的 Ubuntu 版本,因为在不同的 Ubuntu 版本中,相同的包的包依赖项和包依赖项版本要求可能不同。
在 Ubuntu 20.04 中,依赖包已经在默认的 Ubuntu 存储库中可用,因此步骤更加简单。打开终端,将目录更改
cd
为包含 my-package-1.0.0.deb 的目录,然后键入:您唯一的解决方案是为每个版本的 Ubuntu 构建一个包(以及为每个其他 Linux 发行版 - 即使那时您可能不是制作
.deb
. ,而是.rpm
这些发行版使用的任何其他格式)。这确实是传统 APT 包系统(以及 Redhat 和 Arch 上的竞争系统)的主要缺点。必须编译您的软件以使用恰好存在于目标系统上的依赖项的版本。
这是开发这些更新的打包系统(例如 Snap、Flatpak 和 Appimage)的主要动机之一。这些系统允许以一种在发行版和发行版上少得多的方式打包 linux 软件。