什么&x2019;为Linux分发二进制应用程序的最佳方式是什么?

什么&x2019;为Linux分发二进制应用程序的最佳方式是什么?,linux,binary,packages,package,software-distribution,Linux,Binary,Packages,Package,Software Distribution,我刚刚完成了从Windows到Linux的应用程序移植。 我必须创建应用程序的安装程序。 应用程序不是开源的,我应该分发应用程序的二进制文件(可执行文件、耦合的.so文件、帮助文件和图像) 我找到了几种方法: - ; - ; - 我不喜欢第一种方法(RPM和DEB软件包),因为我不想为不同的Linux发行版提供不同的软件包 发布Linux二进制应用程序的最佳方法是什么?没有最佳方法(一般来说)。 tar.gz的二进制文件,这应该是可行的。我在工作中也研究过这一点,我必须同意,确实没有“最佳方法”

我刚刚完成了从Windows到Linux的应用程序移植。
我必须创建应用程序的安装程序。
应用程序不是开源的,我应该分发应用程序的二进制文件(可执行文件、耦合的.so文件、帮助文件和图像)

我找到了几种方法:
- ;
- ;
-

我不喜欢第一种方法(RPM和DEB软件包),因为我不想为不同的Linux发行版提供不同的软件包


发布Linux二进制应用程序的最佳方法是什么?

没有最佳方法(一般来说)。
tar.gz的二进制文件,这应该是可行的。

我在工作中也研究过这一点,我必须同意,确实没有“最佳方法”。如果您的应用程序是作为源代码分发的,那么我将使用打包在tar.gz中的make/configure方法。这在Linux世界中似乎相当普遍


了解如何做的一个好方法是查看更大的组织,看看它们是如何分发二进制文件的。

有很多很好的答案(包括我的:)。尽管这更多的是关于二进制兼容性(您确实需要担心)

对于安装程序,我建议使用autopackage(我们成功地发布了几个版本的软件),他们已经完成了“installer.sh”部分,还有更多(例如桌面集成)

根据包结构的复杂程度,您必须小心地测试您的升级场景和其他内容,但总体来说,它相当整洁。我在1.2.6中修复了一些依赖处理的错误,所以应该可以

更新:原始问题已被删除,因此在此处重新发布完整答案,忽略对已合并到中的自动打包的所有引用,不确定相关部分是否保留

对于可能在发行版中可用的标准库(如crypto++、pthreads等),请动态链接并告诉用户从发行版存储库获取它们。或静态链接(如果可行)

对于必须控制其版本的怪异库(例如,如果您想在敌方侏儒的领地上部署Qt4应用程序),请自己编译它们并安装到只有您的应用程序知道的私人位置

除非您可以确保不干扰您支持的所有发行版的软件包系统,否则不要将私有lib安装到标准位置。(而且他们也不能干涉你)

使用rpath而不是LD_LIBRARY_PATH,并为所有二进制文件和所有相互引用的DLL正确设置它。您可以将二进制文件上的rpath设置为“$ORIGIN;$ORIGIN/./lib;/opt/my/private/libs”,并让链接器在任何标准路径之前搜索这些位置。(我认为必须设置一些链接器标志才能使origin工作)。还要确保在libs上设置rpath:例如,QtGui需要QtCore,如果用户碰巧安装了不同版本的标准软件包,您绝对不希望它被选中(exe->../lib/QtGui.so(4.4.3)->/usr/local/lib/QtCore.so(4.4.2)--这是一种早死的好方法

如果使用任何rpath进行编译,则可以稍后使用chrpath对其进行更改,从而可以在后期处理或安装脚本中调整安装位置

保持二进制兼容性。GLIB_C对于用户来说几乎是静态的,所以您应该链接到一些足够旧的版本。2.3是一个安全的赌注。您可以使用APBuild——一个gcc包装器,它强制执行GLIB_C版本,并且很少执行其他二进制兼容性技巧,因此您不必在一个非常旧的发行版上编译所有应用程序

如果静态链接到任何东西,通常也必须使用APBuild重新构建它,否则它必然会拖动较新的GLIB_C符号。所有的。所以你私下安装的软件自然也要用它来构建。有时,您必须修补第三方LIB以使用旧的符号。(我不得不修补ruby以返回真正的权限,而不是有效的权限,因为在旧的GLIB_C中没有这样的函数。仍然不确定我是否破坏了任何东西:))

要与桌面环境(文件关联、mime类型、图标、开始菜单项等)集成,请使用xdg UTIL。不过要小心,就像linux上的所有东西一样,他们并不真正喜欢文件名中的空格:)。确保在每个目标发行版上测试这些东西——xdg实现充满了bug和怪癖


对于实际安装,您可以提供各种本机软件包(rpm、deb和其他一些),或者推出您自己的安装程序,或者绕过本机软件包管理器找到在所有发行版上工作的安装程序。为此,我们成功地使用了Autopackage(与制作APbuild的人相同)。

可以在Debian上安装RPM,在RHEL上安装APT

如果要静态链接此程序,或者只动态链接要在包中分发的库,那么如何分发它就无关紧要了。最简单的方法是tar.gz,这样就行了


o如果它与系统库动态链接,特别是如果它依赖于将与客户机的其他应用程序共享的动态库,那么您需要执行RPM、APT或两者兼有。

我告诉您另一种可能性,尽管我不知道它的状态:。Loki是一家为Linux做视频游戏移植的公司。它在2002年关闭了,但安装程序是可用的

。不过我不知道现在的情况

虽然很多人建议你使用tar.gz,但请不要这样做。我假设您希望为用户提供愉快的安装过程体验。gz是你能做的最低级、低质量、低可用性的选择之一。它无处不在,因为它基本上什么都不做,你知道的

在freedesktop.org和LSB上的人都很清楚应该把东西放在哪里。你需要的是一个友好的程序来做这件事
<?xml version="1.0" ?>
<interface uri="http://mysite/myprog.xml"
           xmlns="http://zero-install.sourceforge.net/2004/injector/interface">
  <name>MyProgram</name>
  <summary>what it does</summary>
  <description>A longer description goes here.</description>

  <implementation main='bin/myprog'
                  id="sha1new=THEDIGEST"
                  version='1.0'>
    <archive href='http://mysite/myprogram-1.0.tar.bz2'
             size='10000'/>
  </implementation>
</interface>
0launch http://mysite/myprog.xml