我在我的项目中使用 libcurl,它在运行时依赖于 openssl 和一堆其他 .so。这种依赖有点让人头疼,因为不同的发行版/版本可能包含不同的 openssl 版本。
例如,如果我在 Ubuntu 9.10 上编译我的应用程序,我会在 Ubuntu 11.10 上运行时遇到问题。
首先,这有什么问题?如果您从旧版本的 Ubuntu 升级到新版本,您应该不会遇到问题。如果我没记错的话,您只需要指定您需要的库的最低版本,并且包管理器应该能够安装合适的版本。除非您使用已弃用的功能,否则较新版本的库不应破坏现有应用程序。
我的应用程序真的很小,打包/维护它会有点矫枉过正。另外,要求之一是它应该可以下载和运行。所以,(1)对我来说不是一个选择。
对于 Linux(尤其是 Ubuntu、Fedora 和其他顶级发行版),打包确实是分发应用程序的方式。下载-安装-运行是 Windows 的事情,它不是 Linux 上的人安装软件的方式(好吧,Linux 新手可能......)
您还应该尝试接受发行版,这将随着时间的推移减轻您的负担。至少在 Ubuntu 上,实现这一目标的第一步是创建自己的 PPA(https://help.launchpad.net/Packaging/PPA)。
静态链接 (2) 将是不错的解决方案,但似乎没有 libopenssl、libcrypto 和 libcurl 附带的其他传递依赖项的静态二进制分发。
这通常是一件非常非常糟糕的事情。静态链接或只是将库与您的应用程序捆绑在一起会给您带来更新的负担,如果您不更新这些内容,则会产生影响。所以,我不推荐这种方法。有关更多详细信息,请参见此处:http ://www.dwheeler.com/blog/2012/04/03/#insecure-libraries
这是 Fedora 的政策: http://fedoraproject.org/wiki/Packaging: No_Bundled_Libraries
所以,这是一个问题——我错过了什么吗?在 linux 世界(具体来说是 Ubuntu)中,有没有一种不那么痛苦的方式来做我想做的事,而且痛苦更少?欢迎任何建议。
这里真的有两件事要做:
- 打包:理想情况下,这将是 Ubuntu/Debian 的 deb 和 Fedora/Suse 的 rpm。另一种流行的替代方法是使用自动工具(autoconf/automake),以便用户可以使用所需的先决条件构建您的应用程序。最后一个选项是只提供一个 Makefile 和一个 README 并期望您的用户做正确的事情。
- 分发:理想情况下,这是与发行版存储库一起使用的。Ubuntu PPA 是一个很好的起点。另一种方法是在您自己的站点上托管二进制文件/包。
大多数流行的应用程序都为流行的 Linux 发行版提供 .deb/.rpm 以及带有自动工具的 .tar.gz,用于在具有不同打包系统的发行版上构建。
最后,让我问你:你的重点是让你提供你的应用程序变得不那么痛苦,还是让你的用户获得你的应用程序变得不那么痛苦?