繁体   English   中英

Ubuntu 18.04 上的 GCC > 7,预计可以工作?

[英]GCC > 7 on Ubuntu 18.04, expected to work?

我想了解在使用比给定 Ubuntu 版本的“默认”版本更新的 GCC 时,幕后发生了什么。

  1. 从普通的 Ubuntu 18.04 开始,我有:
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
  1. 然后我安装 gcc-11(通过工具链/test ppa repo),我得到:
/usr/lib/gcc/x86_64-linux-gnu/11/libstdc++.so

我还注意到系统提供的版本被覆盖了!

/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29

  1. 我可以用g++-11编译一个 hello-world 应用程序,并通过ldd获得以下内容:
ldd a.out 
    linux-vdso.so.1 (0x00007ffc79ff7000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd378546000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd378155000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd377db7000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fd378b55000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd377b9f000)

所以它链接到系统安装的libstdc++版本,而不是编译器提供的版本。 二进制运行得很好。

我的问题是:

  • 这是预期的工作还是我的小例子很幸运? 什么可能出错?
  • 为什么系统提供的库会被覆盖? 什么?
  • 如果有适用于 Ubuntu 18.04 的 GCC-11 版本,是否意味着它可以保证在 Ubuntu 18.04 中工作?
  • 两个 libstdc++ 库(系统提供的和 gcc-11 提供的)有何不同?
  • 其他库呢,比如 libgcc_s.so? 同样发生,有“系统”提供的一个,和“海湾合作委员会提供的”一个。
  • 我是否需要担心 ldd 中存在的剩余库? (libc、libm、linux-vsdo)。 系统中似乎只有一个版本,但我想知道在安装 GCC 时它们是否会被覆盖。

谢谢!

在我从评论中获得了所有重要信息之后,我想我已经有了足够的理解来回答这个问题。 谢谢大家!

  • 如果libstdc++具有相同的主要版本(SONAME 中的版本),则它们是向后兼容的 这意味着建立在较旧的libstdc++上的东西保证可以在较新的libstdc++上运行。

  • 一般情况下,情况并非如此——库不是向前兼容的 如果在新库中引入了新符号,则旧库中自然不存在该符号。 这可以重现如下:

    • 从 Ubuntu 20.04 开始。

    • 这里复制示例代码。

    • 使用默认的 GCC 9 和-std=c++17编译它。

    • 这个二进制文件在 Ubuntu 20.04 上运行良好。

    • 现在,将该二进制文件复制到 Ubuntu 18.04。

    • 你会得到一个“找不到符号的错误”:

       ./a.out: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./a.out)
  • 当您在 Ubuntu 上安装新的 GCC 时,它将使用 GCC 提供的libstdc++ (因此它们是相同的)覆盖系统范围的 libstdc++(可能是其他库?)。 这将确保您在该机器上构建的任何内容也将在那里运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM