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(通过 toolchains/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++ 的系统安装版本,而不是编译器提供的版本。二进制文件运行得很好。

我的问题是:

谢谢!

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

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

  • 相反的情况通常不成立 - 该库 不向前兼容 。如果在新库中引入了一个新符号,它自然不会存在于旧库中。这可以重现如下:

    • 开始于 Ubuntu 20.04.

    • here复制示例代码。

    • 使用默认的 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 时,它将 覆盖 系统范围的 libstdc++(可能是其他库?)与 GCC 提供的 libstdc++(所以它们是相同的)。这将确保您在那台机器上构建的任何内容也将 运行 在那里。