首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC >7上Ubuntu 18.04,预期会工作吗?

GCC >7上Ubuntu 18.04,预期会工作吗?
EN

Stack Overflow用户
提问于 2021-10-13 17:30:24
回答 1查看 633关注 0票数 0

我想了解在使用比Ubuntu的“默认”版本更新的GCC的引擎盖下发生了什么。

  1. 从一个简单的Ubuntu 18.04开始,我有:
代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25
  1. 然后我安装gcc-11 (通过工具链/测试ppa回购),我得到:
代码语言:javascript
复制
/usr/lib/gcc/x86_64-linux-gnu/11/libstdc++.so

我还注意到,系统提供的版本变得过分了!

代码语言:javascript
复制
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.29
  1. 我可以用g++-11编译hello-world应用程序,并通过ldd获得以下内容
代码语言:javascript
复制
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++版本,而不是编译器提供的版本。二进制程序运行得很好。

我的问题是:

  • 这是预期的工作,还是我只是幸运地用我的小例子?什么可能会出错?
  • 为什么系统提供的图书馆占上风?用什么?
  • 如果有GCC-11的Ubuntu 18.04,这是否意味着它保证在Ubuntu18.04工作?
  • 这两个libstdc++库(系统提供的和gcc提供的)有什么不同?
  • 其他库呢,比如libgcc_s.so?同样的事情也发生了,有“制度”提供的,有“GCC提供的”。
  • 我是否需要担心ldd中剩下的libs?(libc,libm,linux-vsdo)在系统中似乎只有一个版本,但我不知道它们在安装GCC时是否会变得过火。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-21 07:50:56

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

  • 如果backwards-compatible.具有相同的主要版本(SONAME中的),那么它们就是libstdc++这意味着构建在旧libstdc++上的东西肯定会在较新的libstdc++上运行。
  • 相反的情况通常并非如此--库是,而不是与前向兼容的。如果在一个新的库中引入了一个新的符号,那么它自然就不存在于旧的库中。这一情况可转载如下:
代码语言:javascript
复制
- Start on Ubuntu 20.04.
代码语言:javascript
复制
- Copy the example code from [here](https://en.cppreference.com/w/cpp/filesystem/directory_iterator).
代码语言:javascript
复制
- Compile it with the default GCC 9 and `-std=c++17`.
代码语言:javascript
复制
- This binary runs fine on Ubuntu 20.04.
代码语言:javascript
复制
- Now, copy that binary over to a stock Ubuntu 18.04.
代码语言:javascript
复制
- You'll get a "symbol not found error":

./a.out: /usr/lib/x86_64-linux-gnu/libstdc++.so.6:未找到`GLIBCXX_3.4.26‘版本(./a.out要求)

  • 当您在Ubuntu上安装一个新的GCC时,它将覆盖整个系统的libstdc++ (可能是其他库吗?)与GCC提供的libstdc++ (所以他们是相同的)。这将确保您在该机器上构建的任何内容也将在那里运行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69559867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档