【发布时间】: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 奇迹般地被解析。
标签: c++ boost protobuf-c