Debian Buster 中的库不匹配?
Posted
技术标签:
【中文标题】Debian Buster 中的库不匹配?【英文标题】:Mismatched libraries in Debian Buster? 【发布时间】:2020-06-02 16:02:14 【问题描述】:注意:所有这些工作都是在封闭的网络上完成的(即无法访问互联网)。
我被发生的 GCC 5.0+ STL 更改所困扰。据说其他帖子从 GCC 5.0 开始,标准模板库经历了更新,现在有旧版 stl 和严格合规性 stl。使用 _GLIBCXX_USE_CXX11_ABI 1 构建的代码不会与使用 _GLIBCXX_USE_CXX11_ABI 0 构建的代码链接。设置为 0 表示旧版 stl(即 std::string),而设置为 1 则构造 std::__cxx11::string。
如果所有用户代码都被重新构建以匹配新库,那么可以使用,但是如果 debian 包的构建不同怎么办???现在呢?
例如,将 Debian 8.11 (Jessie) 系统升级到 10.3 (Buster),升级中包括 Boost 和 Protobuf。 现在使用默认的 _GLIBCXX_USE_CXX11_ABI 1 构建我的软件并使用 Protobuf 获取链接错误,因为它似乎是使用 pre-gcc 5.0 或 ABI 设置为 0 构建的 Protobuf。Boost 还有其他问题,它无法找到一些 std::__cxx1112::string (看过一次)或只是 std::string。
下载了 Boost 的源代码,转移到封闭网络,并使用 ABI 1 构建,我的代码现在链接到 boost,但仍然无法链接到 protobuf。 使用 ABI 0 构建了 Boost 和我的代码,现在两者的链接都成功了。
仍在获取 Buster 的新镜像以确定是否可以解决,但是我拥有的版本有不匹配的库(不兼容)
这只是一个警告,并非所有事情都像看起来那样。
Boost 从 1_55 到 1_67,protobuf 9 到 17,gcc 4.8 到 8。此外,在撰写本文时,Glassfish 与 Buster 版本的 JDK 不兼容。
【问题讨论】:
我不敢相信我居然称它为there。 知道 JDK11 与 Glassfish 不兼容,因此 Debian 软件包被挑选用于升级,而不是完整的 apt-get upgrade 和 apt-get dist-upgrade。因此升级了一组最小的软件包。 完成完整升级和 dist-upgrade 时,链接错误会解决,但随后会遇到 Glassfish 问题。似乎还有其他真正的依赖项未在精选包的依赖项列表中列出。因此,其他一些包(不知道是哪个包)允许未解析的 protobuf 奇迹般地被解析。 【参考方案1】:我也在question leading up to this 一个。
我会挑几点来说明:
如果重新构建所有用户代码以匹配新库,则可以正常使用
确实
但是如果 debian 包的构建不同呢???现在呢?
这通常不会发生。 Debian 的 QA 和构建服务器受到非常严格的控制,除非有人非常严重地滑倒,否则不会出现这种情况 - 即便如此,除非软件包没有用户,否则它会在测试中立即被发现。
[...] 使用 Protobuf 出现链接错误,因为似乎 Protobuf 是使用 pre-gcc 5.0 或 ABI 设置为 0 构建的 [...]
如果您似乎仍然处于这种情况,我们可以像我之前的回答一样进行一些分析,但这次是针对 libprotobufX。可能发生的事情是
您的库路径中有恶意(非发行版)共享库(检查 ldconfig
、LD_LIBRARY_PATH、-L 标志)
或者在 成功 链接上(因此使用解决方法)检查链接的二进制文件上的 ldd
是否从预期位置加载 libprotobufXXX.so。如果有意外的位置,可能会有
ldconfig
位置,如上所述
可能有RPATH
/RUNPATH
条目被链接器烘焙到ELF 映像中(在您的构建脚本中查找-Wl,rpath
或类似内容)。要检查二进制文件以确认这一点:
objdump -x binary-or-library |grep RPATH
objdump -x binary-or-library |grep RUNPATH
您的升级可能未成功更新该软件包(检查升级过程是否有错误、您的 repo-mirror 的状态)
您有一个非 Debian(或不受支持)的 apt 源列表(检查 /etc/apt/sources.list
、/etc/apt/sources.list.d/*.list
) - 这些构建可能无法维持相同级别的发行版一致性
副业,通常是规范的启动板 PPA 倾向于重用发行版构建基础架构,所以我认为只要发行版/组件条目与您的安装匹配,它们通常就可以了
或者,您可以在完整的apt-get update
之后检查 APT 缓存的内容,例如
apt-cache show libprotobuf.*
顺便说一下,如果您发现软件包有问题,这也会给您维护者和联系地址。 (可能有更适合这个的错误跟踪器,我在这个领域不知道)
希望这可以帮助您找到潜在客户
仍在获取 Buster 的新镜像以确定是否可以解决
听起来不错
但是我的版本有不匹配的库(不兼容)
我不知道这是什么意思
Boost 从 1_55 到 1_67,protobuf 9 到 17,gcc 4.8 到 8。此外,在撰写本文时,Glassfish 与 Buster 版本的 JDK 不兼容。
哇,这些都是大跳跃。如果 JDK 有问题,IME 有助于安装 Java 8 或 9 JDK/JRE 并将其设为默认值,例如
$ update-alternatives --config java
There are 2 choices for the alternative java (providing /usr/bin/java).
Selection Path Priority Status
------------------------------------------------------------
0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
* 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode
【讨论】:
“但是我的版本库不匹配(不兼容)” 指的是,我正在使用的当前镜像(封闭网络)存在 libprotobuf17 和 boost1.67 的问题。这就是为什么我要等待最新的软件包副本来替换当前镜像。以上是关于Debian Buster 中的库不匹配?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Debian Buster 上安装 php 调试符号?
从 Debian Stretch 升级到 Buster 后出现 OCS 错误
如何在 debian:buster 中使用脚本安装 mysql-server 而不会询问任何配置问题?
Debian Buster Nginx 布署 Brophp 项目(类 Thinkphp)
存储库“http://security.debian.org/debian-security buster/updates InRelease”将其“Suite”值从“stable”更改为“oldst