编译的共享库依赖于特定的libicuuc.so.46版本

时间:2014-11-09 20:22:39

标签: c++ linux cmake shared-libraries icu

我正在使用基于libicuuc.so和朋友的cmake在SUse Linux上使用g ++编译共享库。

Suse在/ usr / lib中有libicuuc.so,libicuuc.so.46和libicuuc.so.46.1。

现在,当我使用ldd列出我的库的依赖项时,它告诉我它依赖于libicuuc.so.46。

由于我想以二进制形式分发我的库(在快速PC上编译需要大约45分钟),这种依赖性是一个问题。目标PC有不同版本的libicuuc.so。

我可以做什么,以便我的图书馆依赖于libicuuc.so而不是libicuuc.so.46?

我在编译之前尝试删除/ usr / lib文件夹中的so.46版本,但libicuuc.so依赖于libicudata.so.46所以我将这种依赖性保留在我试图避免的46版本上。

1 个答案:

答案 0 :(得分:1)

了解外部库版本控制here

  

我能做什么才能让我的图书馆依赖于libicuuc.so而不是libicuuc.so.46?

你无法做任何事情。您拥有的libicuuc.so SONAME设置为libicuuc.so.46,并且链接器尽职地记录该依赖项(因为它应该)。

如果开发人员发布libicuuc.so.47,他们会这样做,因为新的库与旧版本不兼容ABI(至少他们应该怎么做,如果他们不是一无所知)。

如果你的库加载libcuuc.so.47(如你所愿),它很可能会因ABI不兼容而崩溃。或者更糟:损坏最终用户的数据。因此,实现您想要的结果会让您陷入比现在更糟糕的更糟糕的麻烦(不运行比随机崩溃或破坏数据更好)。

<强>更新

libicuuc.so documentation 明确表明&#34;二进制兼容性适用于共享相同主要+次要号码的版本。&#34;

这意味着:您无法链接使用版本4.6(SONAME libicuuc.so.46)编译的库,并期望它可以与版本4.7一起使用。

必须为每个版本的ICUUC重建您的库,或者将匹配的libicuuc.so.NN与您的库分发(并希望该用户尚未使用其他版本的{{1} }})。

另一种可能的替代方法:将libicuuc静态链接到您的库中,并hide所有libicuuc.a个符号,这样它们就不会与其他任何内容发生冲突。注意:这有许可意义。