首页 > 解决方案 > Ubuntu 18.04 上的 GCC > 7,预计可以工作吗?

问题描述

我想了解在使用比给定版本的 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. 我可以用 编译一个 hello-world 应用程序g++-11,并通过以下方式获得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++,而不是编译器提供的版本。二进制运行得很好。

我的问题是:

谢谢!

标签: c++linuxgcclibstdc++

解决方案


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

  • 如果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++(因此它们是相同的)。这将确保您在该机器上构建的任何内容也将在那里运行。

推荐阅读