.so.0和.so.0.0.0文件的区别

9
我正在使用一个包含.so.0文件的市场数据源实现。然而,这些是指向实际.so.0.0.0文件的“软链接”。为什么要这样做?
当我尝试复制这些.so.0链接时,最终会复制一个带有.so.0前缀的.exact replica of the .so.0.0.0文件。
补充评论:
所以我有一个libfoo.so文件,并且它通过jni被java访问。这个libfoo.so文件实际上是一个指向libfoo.so.0.0.0的软链接。如果我没有libfoo.so,Java或任何其他编译代码如何确定libfoo.so.0.0.0是要使用的共享对象?

3
什么是“市场数据源”?这些文件是什么?这与Java有什么关系? - bmargulies
我相信_"市场数据源"_可能是某种COTS数据连接解决方案,它在共享对象文件中提供其实现,但我不是Java程序员 ;) - D.Shawley
这与Java无关 - 您的so文件是由平台相关的应用程序找到的,例如Linux上的ld - Robert Munteanu
请不要因为您不知道答案就给我点踩... - QueueHammer
2个回答

10

这样做可以让程序绑定到具有相同接口的任何版本的libfoo(我想要最新的libfoo更新),或者绑定到特定版本(我想要稳定性和与我测试过的确切版本)。


我有一个名为libfoo.so的文件,它通过JNI被Java访问。实际上,这个libfoo.so文件是一个指向libfoo.so.0.0.0的符号链接。如果我没有libfoo.so会发生什么?Java或任何其他编译代码如何确定libfoo.so.0.0.0是要使用的共享对象? - user242591
如果你有libfoo.so.0.0.0,你应该始终拥有libfoo.so.0和libfoo.so,这是libtool工作的一部分;如果它们不存在,那么它们生成库的方式就是错误的。 - Ana Betts
@user242591,这并不重要,但如果你有libfoo.so.0.0.0,那么你几乎肯定也有libfoo.solibfoo.so.0,如果没有这些文件,那就会影响到很多除你的程序之外的其他程序。具体影响程度和受影响的程序数量取决于该库的流行程度,例如如果是SDL这样的库,那么很多程序都依赖它,所以如果没有它,很可能会导致一些东西无法正常运行;但如果缺少的是libsidplay2.so.1这样的库,那么依赖它的程序就不会很多(我认为不会很多),因为它只是一个播放C64声音文件的库,虽然也许某个(我的?)媒体播放器依赖它。 - jgh fun-run

7

.0和.0.0.0文件的存在是为了进行版本控制:

  • foo.0代表库的.0版本。所有.0版本的库将使用相同的接口,但可能有不同的实现。(希望后续的实现比早期的实现更少出现错误。)

  • foo.0.0.0代表.0版本的特定实现。

现在拥有软链接没有什么用处。但以下情况可能会发生:

foo的程序员发现他的库中有一个bug。他发布了foo.0.0.1。然后foo.0现在链接到foo.0.0.1。然后发生两件事情:

  • 所有链接到foo.0的文件都会自动更新到foo.0.0.1。
  • 所有链接到foo.0.0.0的文件将继续使用旧的foo.0.0.0。

将其扩展几个级别,您可以通过链接到libfoo.0.0.0来要求精确版本匹配,或者通过libfoo.0与任何匹配的接口版本进行匹配,或者通过libfoo与任何版本进行匹配。 - D.Shawley
非常抱歉问一个基础的问题,但是这个链接是如何指定的呢?我该如何指定jni使用libfoo.so而不是libfoo.so.0.0.0呢? - user242591
嗨嗨,程序员朋友。遗憾的是,Java文档并没有提供太多帮助:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#loadLibrary(java.lang.String) 上说“库名称映射到实际系统库的方式取决于系统。”或许在 https://dev59.com/60jSa4cB1Zd3GeqPCA3t 上能找到一些帮助。祝好运。 - Chip Uni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接