gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:10 26 4
gpt4 key购买 nike

我正在使用依赖于 libicuuc.so 和 friend 的 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 版本的依赖,这是我试图避免的。

最佳答案

阅读有关外部库版本控制的信息 here .

What can I do so that my library depends on libicuuc.so and not libicuuc.so.46?

你对此无能为力。您拥有的 libicuuc.soSONAME 设置为 libicuuc.so.46,并且链接器会尽职地记录该依赖项(因为它 应该)。

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

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

更新:

libicuuc.so documentation 明确声明“二进制兼容性适用于共享相同主+次编号的版本。”

这意味着:您不能链接使用 4.6 版编译的库 (SONAME libicuuc.so.46) 并期望它与 4.7 版一起工作。

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

另一种可能的选择:将libicuuc.a 静态链接到您的库中,并且hide所有 libicuuc.a 符号,这样它们就不会与其他任何东西冲突。注意:这会影响许可。

关于c++ - 编译的共享库依赖于特定的 libicuuc.so.46 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com