有没有办法在 CentOS 上部署在 Ubuntu 上构建的应用程序?如果是这样,怎么办?
编辑:抱歉,我应该提供更多信息。
它基于 Ubuntu 15.10 和 Qt 5.6 构建,除了 Qt 之外,它只有一个静态链接的其他依赖项。我不确定它的依赖项是否也是静态链接的,但它使用了一些 boost 库,并且没有任何特定于 Ubuntu 的东西,所以我猜这应该不是问题。
答案1
您可以在任何其他发行版上运行为一个 Linux 发行版编译的应用程序,只要该其他发行版具有可用的所需库即可。实践中的问题通常是不同的发行版在给定时间点发布不同版本的库。
静态链接库是一个坏主意。它会使应用程序文件大小膨胀(在大多数情况下,除了互联网带宽很少的人之外,没什么问题),使内存中的应用程序大小膨胀(这在实践中更值得关注),并且意味着您的应用程序将陷入困境您链接的版本中的所有错误。动态链接您的库,以便您的用户将从库的错误修复中受益,尤其是安全修复。
此外,虽然您可以跑步应用程序中,存在封装问题。手动安装应用程序很痛苦。如果您不为 CentOS 分发 RPM 软件包,为 Ubuntu 分发 deb 软件包,则会损害您的用户。
因此,您应该为所有发行版生成适当的包。你可以跑步为 CentOS 上的 Ubuntu 构建的应用程序,或多或少的努力取决于库的要求,但你不能部署为 CentOS 上的 Ubuntu 构建的应用程序。
答案2
这取决于应用程序的创建方式以及它具有哪些依赖项。如果它是用 Python 等编写的,那么只要安装了兼容的 Python 解释器和模块,它通常就可以运行。
如果它是 elf 二进制文件,则取决于是否安装了二进制兼容库。由于某些库可能不可用,仅作为不兼容的版本可用或具有错误的soname,那么您可以静态链接二进制文件或将缺少的库与应用程序一起分发。
您还可以使用弗莱帕克打包您的应用程序,然后在多个发行版上使用它。
答案3
正如其他人提到的,直接将应用程序安装/解压到系统上可能会也可能不会起作用,具体取决于它是脚本还是编译的二进制文件、静态链接还是动态链接、lib 版本等。
为了确保应用程序能够运行,应用程序需要在其构建的操作系统上下文中运行。最简单的方法之一是 docker。这是一个有点繁重的解决方案,但它本质上可以让您在一个操作系统中运行另一个操作系统。所以你可以运行一个 ubuntu 容器并将你的应用程序放入其中。
您也可以只设置一个 ubuntu chroot,并在其中执行应用程序。这与 docker 的做法类似,但要轻得多。
这些解决方案唯一无法解决的问题是应用程序是否依赖于仅在 ubuntu 中存在的特定内核功能。但这是不太可能的。