在经过大量修改的 Ubuntu 14.04 上以并行/子前缀构建和安装 GCC 12

在经过大量修改的 Ubuntu 14.04 上以并行/子前缀构建和安装 GCC 12

我仍然经常使用的一个系统运行着一种“Frankenbuntu”14.04,它通过我构建和安装的 PPA 和软件收到了许多额外的更新/opt/local(使用适用于 Mac 的 MacPorts 端口系统的改编版本;事实上,我我的大部分 Linux ports 也安装在 Mac 上)。

该前缀下的库目录不会添加到 ldconfig,因此我依赖于LD_LIBRARY_PATH.

我一直使用 clang 8 作为我的主编译器(曾经通过 LLVM 存储库提供的最新版本),因为它比 Ubuntu (9.4.0) 提供的最新 GCC 更快一些,而且可能更强大。我自己构建了 clang 12(这是一个非常无聊的耐心练习!),但请阅读一下你确实需要 clang 17 才能获得适当的 c++20 支持。或海湾合作委员会 12。

我碰巧port也有 GCC 12,但在 /opt/local 下安装 GCC (7) 之前我遇到了麻烦,这些问题与混合 libstdc++ 运行时有关。那些可能这是因为操作系统已经拥有(或更新到)较新的 libstdc++(来自 GCC 9.4.0 的版本),并且类似的情况不会再次发生。至少在我升级操作系统之前不会。

尽管如此,我还是想询问一些最新的最佳实践和对陷阱的简洁概述(对于多年来一直在并行前缀上安装和运行的人来说,这些陷阱不太明显)。 libstdc++ 9.4.0 和 12.3.0 之间是否存在任何已知的不兼容性?或者是我在 Mac 上安装的 13.2.0 版本的 libstdc++?

提前致谢!

针对前几条评论:

  • 我是复古计算的“粉丝”。

  • 我知道我的操作系统很旧并且不再受支持。我有理由在这台特定的机器上保留它的这个版本,并且我真的不寻找进一步的建议,升级只需要 XX 分钟。根据经验,我知道这需要更多时间,系统可能会不稳定,直到我至少降级到已知兼容的内核(4.14.328 ATM),同时我将无法使用它任何有用的东西。仅仅为我的并行前缀构建 GCC 可能需要 5 小时,并且完全可逆(MacPorts 有一个非常方便的取消/激活功能

  • 我还知道 libstdc++ 不向前 ABI 兼容,但它至少旨在兼容向后ABI 兼容:

    apt 包含 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 libstdc++6:amd64: /usr/lib/x86_64-linux-gnu/libstdc++.so.6 apt show libstdc++6 软件包:libstdc ++6 状态:已安装 自动安装:无 Multi-Arch:相同 版本:9.4.0-1ubuntu1~14.04

port:libgcc13我的 Mac 上安装的 libstdc++ 版本:

> otool -L /opt/local/lib/libgcc/libstdc++.6.dylib
/opt/local/lib/libgcc/libstdc++.6.dylib:
        /opt/local/lib/libgcc/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.32.0)

相同的 SOVERSION (6),从 dylib 的更严格控制的内置版本控制数字中也可以看出。

我将此解释为表明 libstdc++ v13.2.0 是应该是我目前拥有的版本的直接替代品,就像该版本是 14.04 中仍然可用的早期版本的直接替代品一样:

aptitude 版本 libstdc++6:amd64 软件包 libstdc++6:
p 4.8.2-19ubuntu1 trusty 500 p 4.8.4-2ubuntu1~14.04.4 trusty-security、trusty-updates 500 i 9.4.0-1ubuntu1~14.04 trusty 500

因此,我关于已知的不兼容性和/或问题的问题应该在预期的向后兼容性的背景下阅读。

我已经发现,std::auto_ptr即使在 C++03 模式下,GCC 13 也不再提供它真正应该存在的功能(但如果这是因为构建配置问题则不会)。

答案1

第一个部分答案。

在 ld.so 路径中构建port:libgcc13和测试之后libstdc++.so.6.0.32,我现在可以确认加载该库而不是系统的 .so 库确实没有明显的问题libstdc++.so.6.0.28

根据相应的头文件构建代码甚至无法将其链接到系统 C++ 运行时 ( undefined reference to 'std::bad_function_call::what() const'),这意味着它也无法针对它运行。但这也是可以预料的,对我来说没有问题,只要我记得仅使用此运行时来安装在我的并行前缀下的二进制文件。无论如何,他们会对那里的其他库有强烈的依赖性​​。

相关内容