Ubuntu 18.04 上的 GCC > 7,预计会工作?
GCC > 7 on Ubuntu 18.04, expected to work?
我想了解在给定 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
- 我可以使用
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?同样的情况,有“系统”提供的,还有“GCC提供”的。
- 我是否需要担心 ldd 中存在的剩余库? (libc、libm、linux-vsdo)。系统里好像只有一个版本,不知道安装GCC的时候会不会被覆盖了
谢谢!
在我从评论中获得了所有重要信息之后,我想我已经有了足够的理解来回答这个问题。谢谢大家!
如果 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++
(所以它们是相同的)。这将确保您在那台机器上构建的任何内容也将 运行 在那里。
我想了解在给定 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
- 我可以使用
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?同样的情况,有“系统”提供的,还有“GCC提供”的。
- 我是否需要担心 ldd 中存在的剩余库? (libc、libm、linux-vsdo)。系统里好像只有一个版本,不知道安装GCC的时候会不会被覆盖了
谢谢!
在我从评论中获得了所有重要信息之后,我想我已经有了足够的理解来回答这个问题。谢谢大家!
如果
上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++
(所以它们是相同的)。这将确保您在那台机器上构建的任何内容也将 运行 在那里。