为多个Linux发行版编译

5

简单来说,我即将发布一个用OCaml编写的应用程序,原本计划通过源代码分发。但问题是,OCaml开发系统既不轻便也不常见,因此我希望还可以以二进制方式发布到各种操作系统上。

  • 对于Windows来说,没有问题,因为我可以通过cygwin编译并使用所需的dll文件进行分发
  • 对于OS X来说,也没有问题,因为我可以轻松地编译和分发它(从我尝试过的情况来看,没有外部依赖)

但是,当涉及到Linux时,问题就来了,因为我不知道最佳的编译和分发方法。程序本身不依赖于任何东西(一切都是静态链接的),但如何覆盖多个发行版?

我有一个安装在amd64架构上的Ubuntu服务器10虚拟机,我使用这台机器在Linux下测试该程序,一切正常。当然,如果我尝试将二进制文件移动到32位的Ubuntu上,它就会停止工作,而且我也没能尝试不同的发行版……有什么技巧可以解决这种问题吗?(这似乎是经常出现的问题)

例如:

  • 我能否从同一台机器上编译32位和64位的二进制文件?
  • 在Ubuntu下编译的二进制文件是否也可以在其他发行版上运行?
  • 想要覆盖尽可能多的发行版,应该考虑哪些“分支”?
5个回答

4
  • 在64位机器上,你通常可以轻松生成64位和32位的二进制文件 - 即发行版通常在其编译器包中具有适当的支持,并且您可以实际测试您的构建。请注意,操作系统也需要是64位的,不仅仅是CPU。

  • 静态二进制文件通常可以在任何地方运行,前提是内核和CPU提供足够的支持 - 要确保这一点,请关注您的编译器选项。它们是兼容性最好的选择。共享库可能会有问题。为了解决这个问题,可以将与共享库链接的二进制文件与那些库捆绑在一起,并在需要时使用加载器脚本运行。

  • 您至少应该针对Debian/Ubuntu使用dpkg软件包,Redhad/Fedora/Mandriva使用RPM,以及SUSE/OpenSUSE再次使用RPM(我单独提到这两个RPM情况,因为您可能需要为这些“系列”发行版制作单独的软件包)。您还应该为其余发行版提供.tar.bz2或.run安装程序。

  • 您可以查看Oracle提供的Java和VirtualBox选项,以了解它们如何提供其软件。


2
你可以考虑使用openSUSE构建服务进行构建。虽然由openSUSE运营,但它可以为以下系统构建软件包:
  • openSUSE SUSE
  • 企业版本
  • Mandiva
  • Fedora
  • Red Hat Enterprise/CentOS
  • Debian
  • Ubuntu

1
最好的解决方案是在自由许可证下发布源代码。您可以为几个发行版自己打包(例如 DebianFedora),然后与其他人合作将其移植到其他发行版中。维护者通常只需要进行一些必要的上游更改就能完成大部分工作。

1

是的,您可以从同一台机器编译32位和64位: http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

很可能在Ubuntu上运行的二进制文件也会在其他发行版上运行,唯一需要担心的是是否使用了共享库(特别是如果您使用了某些GUI框架或类似的东西)。

不确定您所说的分支是什么意思,但如果您谈论的是发行版,我会使用最基本的Ubuntu发行版...


0
我建议您为 .deb 和 RPM 打包一个 32 位和 64 位二进制文件,这样您可以覆盖大多数主要的发行版(Debian、Fedora、openSUSE、Ubuntu)。
只需提供清晰的安装说明,关于依赖项的命令行 fu,以及其他发行版的命令行 fu 等等,并且只需分发源代码 tarball,您就不应该有太多问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接