c++ - Ubuntu 18.04 上的 GCC > 7,预计可以工作吗?
问题描述
我想了解在使用比给定版本的 Ubuntu 的“默认”版本更新的 GCC 时发生了什么。
- 从普通的 Ubuntu 18.04 开始,我有:
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
- 然后我安装 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
- 我可以用 编译一个 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++
,而不是编译器提供的版本。二进制运行得很好。
我的问题是:
- 这是预期的工作还是我只是幸运的我的小例子?什么可能出错?
- 为什么系统提供的库会被覆盖?什么?
- 如果有适用于 Ubuntu 18.04 的 GCC-11 构建,是否意味着它可以保证在 Ubuntu 18.04 中工作?
- 两个 libstdc++ 库(系统提供的和 gcc-11 提供的)有何不同?
- 其他库,比如 libgcc_s.so 呢?同样的情况,“系统”提供一个,“GCC 提供”一个。
- 我是否需要担心 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++
(因此它们是相同的)。这将确保您在该机器上构建的任何内容也将在那里运行。
推荐阅读
- dialogflow-es - 如果我想构建 Appointment Scheduler bot 和 Google Calendar bot,是否需要在 dialogflow 中使用两个代理?
- mysql - 如何计算每年销售的产品总量?
- c++ - 结构中的默认成员值或默认构造函数参数?
- azure-data-factory - 如何在 ADFV2 中创建文本文件并将错误消息插入其中
- javascript - 我如何在 dicord.js 嵌入中发送代码块
- javascript - 如何删除目录NodeJs中的所有json文件
- multithreading - ( Delphi fmx ) 你能在后台线程中创建 UI 控件而不阻塞用户界面吗
- javascript - 如何找到最后一个文本节点
元素?
- java - Hibernate/JPA - 仅当表中存在时才插入字段
- neo4j - 同一台机器上有多个版本的 neo4j 服务器