c++ - 处理 linux 上的库依赖

标签 c++ linux dependencies openssl libcurl

我在我的项目中使用 libcurl,它在运行时依赖于 openssl 和其他一堆 .so。
这种依赖性有点让人头疼,因为不同的发行版/版本可能包含不同的 openssl 版本。

例如,如果我在 Ubuntu 9.10 上编译我的应用程序,我在 Ubuntu 11.10 上运行时会遇到问题。

我看到有两个选项可以解决这个问题,但没有一个对我的情况来说不够好:

  1. 打包我的应用,让包管理器解决这类问题

  2. 静态链接所有部门

我的应用程序非常小,打包/维护它太过分了。另外,其中一项要求是它应该可以下载并运行。所以,(1) 对我来说不是一个选项。

静态链接 (2) 将是一个不错的解决方案,但似乎没有 libopenssl、libcrypto 和 libcurl 附带的其他传递依赖项的静态二进制分发版。

理论上我可以尝试手动构建 libcurl 背后的所有库库,但似乎这会使维护变得更加复杂。

那么,问题来了——我是不是漏掉了什么?在 linux 世界(具体来说是 Ubuntu)中,有没有一种不那么痛苦的方式来做我想做的事情?欢迎提出任何建议。

最佳答案

I am using libcurl in my project and it depends on openssl and bunch of other .so in runtime. This dependency is kind of pain in the ass, since different distributives/versions may contain different openssl versions.

For example i am experiencing problems running on Ubuntu 11.10 if i compilled my app on Ubuntu 9.10.

首先,这有什么问题?如果您从旧版本的 Ubuntu 升级到新版本,应该不会有问题。如果我没记错的话,你只需要指定你需要的库的最低版本,包管理器应该能够安装合适的版本。较新版本的库应该不会破坏现有应用,除非您使用的是已弃用的功能。

My app is really tiny and package/maintain it would be overkill. Plus, one of the requirements is that it should be download-and-run'able. So, (1) is not an opton for me.

对于 Linux(尤其是 Ubuntu、Fedora 和其他顶级发行版),打包确实是分发应用程序的方式。下载-安装-运行是 Windows 的事情,而不是 Linux 用户安装软件的方式(好吧,Linux 新手可能...)

您还应该尝试接受发行版,这将随着时间的推移减轻您的负担。至少在 Ubuntu 上,第一步是创建您自己的 PPA ( https://help.launchpad.net/Packaging/PPA )。

Static link (2) would be not-bad solution but it seems that there is no static binary distributions of libopenssl, libcrypto and other transitive dependencies that come with libcurl.

这通常是一件非常非常的坏事。静态链接或仅将库与您的应用程序捆绑在一起会给您带来更新它的负担,如果您不更新它们,则会产生影响。所以,我不推荐这种方法。有关更多详细信息,请参见此处:http://www.dwheeler.com/blog/2012/04/03/#insecure-libraries

这是 Fedora 的政策:http://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries

So, here is the question - am I missing something? Is there a less painful way to do what I want in linux world (Ubuntu to be specific) with less pain? Any suggestions are welcomed.

这里确实有两件事要做:

  1. 打包:理想情况下,对于 Ubuntu/Debian 是 deb,对于 Fedora/Suse 是 rpm。另一种流行的替代方法是使用 autotools (autoconf/automake),以便用户可以使用所需的先决条件构建您的应用程序。最后一个选项是只提供一个 Makefile 和一个 README,并期望您的用户做正确的事情。
  2. 发行版:理想情况下,这是发行版存储库。 Ubuntu PPA 是一个很好的起点。另一种方法是在您自己的站点上托管二进制文件/程序包。

大多数流行的应用程序都为流行的 Linux 发行版提供 .deb/.rpm 以及带有自动工具的 .tar.gz,以便在具有不同打包系统的发行版上构建。

最后,让我问您:您的重点是让您提供应用程序时不那么痛苦,还是让您的用户在获取您的应用程序时不那么痛苦?

关于c++ - 处理 linux 上的库依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10426868/

相关文章:

java - Android 设备中的 OpenCV Java API 或 OpenCV C++ API?

c++ - STL 中的 find() 与 binary_search()

linux - 资源暂时不可用ttyS3

c - 在 C 中以编程方式获取网络链接类型和速度

c++ - 内联函数(C++)是高效的,为什么我们不把每个函数都定义为内联函数呢?

c++ - 从 Math C++ 获取美分

linux - 根据linux中的字符位置排序

java - Maven 项目对 JDK 版本的依赖

c++ - 类相互依赖问题

java - JAR list 中缺少 Maven 工作区和系统依赖项