在Linux上依赖库处理(Dealing with library dependencies on

2019-07-29 05:55发布

我使用的libcurl在我的项目,它依赖于OpenSSL和一堆运行其他的.so的。
这种依赖是一种在屁股痛的,因为不同的distributives /版本可能包含不同的OpenSSL版本。

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

我看到两个选项如何解决这一点,但他们都不是不够好,我的情况:

  1. 打包我的应用程序,让包管理器解决这类东西

  2. 静态链接所有DEPS

我的应用程序是真的很小,而打包/维持这将是矫枉过正。 另外,其中一个要求是,它应该是下载和run'able。 因此,(1)是不是对我的OPTON。

静态链接(2)将不坏的解决方案,但它似乎有libopenssl,libcrypto以及来自于其他的libcurl传递依赖的无静电二进制分发。

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

所以,这里是一个问题 - 我这么想吗? 有没有那么痛苦的方式痛苦少做什么,我想在Linux世界(Ubuntu的是具体的)? 任何建议都欢迎。

Answer 1:

我使用的libcurl在我的项目,它依赖于OpenSSL和一堆运行其他的.so的。 这种依赖是一种在屁股痛的,因为不同的distributives /版本可能包含不同的OpenSSL版本。

比如我遇到在Ubuntu 11.10上运行,如果我compilled在Ubuntu 9.10我的应用程序的问题。

首先登场的,这有什么问题吗? 你不应该有,如果你达从旧版本的Ubuntu移动到较新的一个问题。 如果我没有记错的话,你只需要指定你至少需要一个库,包管理器的版本应该是能够安装合适的版本。 除非你使用建议使用的功能库的更新不应破坏现有的应用程序。

我的应用程序是真的很小,而打包/维持这将是矫枉过正。 另外,其中一个要求是,它应该是下载和run'able。 因此,(1)是不是对我的OPTON。

对于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的是具体的)? 任何建议都欢迎。

真的有两件事情在这里做的:

  1. 包装:理想情况下,这将是DEB的Ubuntu / Debian和转速为Fedora / Suse的。 另一个流行的选择是使用自动工具(的autoconf / automake的),使用户可以建立所需的预请求数您的应用程序。 最后一个选项是提供只是一个Makefile和README和期望你的用户做正确的事。
  2. 分布:理想情况下,这是与发行库。 Ubuntu的PPA是一个很好的起点。 另一种方法是托管在自己的网站上的二进制文件/包。

最流行的应用程序建立在具有不同的包装系统发行版同时提供了流行的Linux发行版一个.deb /的.rpm以及以.tar.gz与自动工具。

最后,让我问你:是你应把重点放在它那么痛苦,为您提供您的应用程序,或使它痛苦少为您的用户获取您的应用程序?



Answer 2:

还有第三个选项:

创建某种适合您的需求,包括你所需要的,这取决于平台的.so / .dll文件的归档。 ZIP档案应适用于Linux和Windows。

然后使用LD_LIBRARY_PATH在包装脚本为你的Linux系统(它可以让你把你的.so文件在一些特殊的地方,通常在libs目录)。 Windows中,据我所知,使用CWD以寻找由二进制需要.dll文件首位因此,所有你需要做的就是将它们放在同一目录中的二进制和你去好。

使用这种方法,你要保持你的“分发”小而没有必要对静态链接或其他任何特殊处理。

只要确保你分析的实际依赖关系链为您的.so / .dll文件为当一些意外库在目标环境中被加载不了惊讶。



Answer 3:

你有没有考虑用qt? 你根本不会有这些问题存在,他们有强大的rmeasy支持SSL和HTTP的



Answer 4:

所以你问“有没有那么痛苦的方式。” 我喜欢其他的答案,特别是纳文的回答。 所以,你有两种解决方案

  1. 在操作系统中使用.so文件(共享库),并推荐给你的用户,他们使用“至少x版本。” 那将非常照顾一切。

  2. 无论是捆绑非共享(静态)库 - 的.a文件 - 与您的应用程序或捆绑的共享库 - 的.so文件 - 与您的应用程序。

静态.a文件是从使用的./configure脚本的源码编译非常简单。 的.so文件,就可以轻松搞定,但你会需要相当技巧与应用程序捆绑他们。 的.so文件,可以修补; 他们从里面依赖地方应加载称路径。 所以捆绑.so文件是不可能的,甚至可能是避免建设.a文件进行了一系列的依赖关系的手动操作的简便方式 - 如果你发现并使用脚本搬迁.so文件。

你写:

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

是的,它会,因为你要安全补丁,因为他们出来,对不对? 所以最好的方法是#1 - 让用户安装最新版本的,他可以在得到他的手,并切实负起责任,使他的系统安全。

解决方案#2是很方便的,当你打,你正在做的定制工作谁不能使用的解决方案#1客户的情况。 在这里,您提供的时间表软件的定期发行的,包括所有的修复最新的依赖关系。 小软件往往会获得一个点,它只是停止需要改变。 该解决方案是不是一个小软件一个很好的解决方案,因为你的软件并没有改变,但你仍然只是实行定期发布,因为依赖有更新。 所以,除非你的客户实际上需要它不使用此解决方案。 这是从长远来看更昂贵。

希望这可以帮助!



文章来源: Dealing with library dependencies on linux