我有一个linux应用程序,它在链接器行链接: libpython2.6.so
这最终解析为libpython.2.6.so.1.0
/usr/lib/libpython2.6.so -> libpython2.6.so.1
/usr/lib/libpython2.6.so.1 -> libpython2.6.so.1.0
其中嵌入了SONAME,因此我坚持将其与完全版本的名称相关联。
g++ foo.cc /usr/lib/libpython2.6.so
ldd ./a.out | grep python
libpython2.6.so.1.0 => /usr/lib/libpython2.6.so.1.0 (0x00007fd36f7ab000)
这意味着如果有libpython2.6.so.1.1,我的应用程序最终会中断。无论如何强制我的应用程序使用通用名称libpython2.6而不是libpython2.6.so.1.0?
我使用了一小部分python API,我认为我应该安全地链接到更通用的库版本名称。
答案 0 :(得分:1)
不要担心libpython2.6的SO版本会增加。它永远不会增加;不会有任何进一步的错误修复版本到2.6,即使有,SO版本也不会增加。
你应该担心libpython2.6会在系统的未来版本中消失(由libpython2.7取代)。但是,没有任何好的解决方案;使用PEP 384,您将能够与libpython3.so链接。
答案 1 :(得分:1)
看看`3.1.1。 http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html中的共享库名称'',这可以帮助您理解共享库的命名方法。
每个共享库都有一个特殊的 名称为
soname''. The soname has the prefix
lib'',名称为。{ 库,短语.so'', followed by a period and a version number that is incremented whenever the interface changes (as a special exception, the lowest-level C libraries don't start with
lib'')。一个 完全合格的soname包含为 为它所在的目录添加前缀;在...上 工作系统完全合格 soname只是一个象征性的链接 共享库的“真实姓名”。每个共享库也都有一个真实的 name'',即文件名 包含实际的库代码。 真实姓名增加了soname a 期间,次要数字,另一个 期间和发行号码。该 最后一期和发行号是 可选的。次要号码和释放 号码支持配置控制 通过让你知道究竟是什么 图书馆的版本是 安装。请注意这些数字 可能与数字不一样 用于描述图书馆 文档,虽然确实如此 事情变得更容易。
另外,还有这个名字 编译器在请求时使用 库,(我称之为``链接器 名字''),这只是soname 没有任何版本号。