【问题标题】:Versions of GLIBCGLIBC 的版本
【发布时间】:2018-07-21 17:32:39
【问题描述】:

我在 Ubuntu 机器上创建了 c++ 应用程序。我已将二进制文件复制到 Centos 机器。出现错误:

/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found

我决定在 ldd --version 命令的帮助下检查我的机器中有哪些版本的 glibc:

Ubuntu: 2.23
Centos6.9: 2.12

为什么 CentOS cmplain 关于 GLIBCXX_3.4.21,而 Ubuntu 拥有 glibc 版本 2.23?

【问题讨论】:

  • GLIBC != GLIBCXX。前者用于glibc的版本符号,后者用于libstdc++的符号。这说明你的 CentOS6 系统上的 libstdc++ 版本太旧了。
  • 你的意思是 GLIBCXX_3.4.21 menas GLIBC ver. 3.4libstdc++ is ver. 21 ?那为什么命令ldd --version 会带来2.122.23
  • 不,GLIBCXX_3.4.21 不会告诉您有关 GLIBC 版本的任何信息。而ldd --version 只会告诉您 GLIBC 版本,它根本无法检测您机器上的 libstdc++ 版本。您可能想看看gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioningstackoverflow.com/questions/10354636/…

标签: c++ linux ubuntu centos glibc


【解决方案1】:

GLIBCXX_3.4.21 之类的符号由编译器生成,用于标记编译使用的 C++ 库的版本(特别是从头文件和模板函数调用的非内联函数)。这是 libstdc++ 库,不是 glibc。

您正在寻找的版本是您的 libstdc++ - 这是 C++ 的一个有趣问题,模板库往往会不时更改,因此函数可能被声明为 unsigned int func(),后来有人决定将其更改为size_t func()。在 32 位机器上没有区别,但在 64 位机器上确实有区别,使用“错误”版本会导致返回值大小出现问题。

有几种不同的解决方案(这不是一个完整的列表):

  1. 确保在两台机器上使用相同版本的 libstdc++。
  2. 在目标机器上编译代码。
  3. 使用静态 libstdc++

【讨论】:

  • 1.我可以在我的 Ubuntu 上同时使用旧的(Centos)libstdc++ 和当前的吗?如何安装它? 3.如何告诉我的Eclipse静态链接libstdc++
  • 1.可能不会同时有两个 - 或者至少,您必须在编译时进行选择。请注意,编译器的头文件也与 libstdc++ 的版本相关联。要与 libstdc++ 进行静态链接,请将 -static -lstdc++ -dynamic 添加到链接命令(-dynamic 不是严格需要的,但它可以防止在此之后指定的其他库被静态链接)。你是如何在 Eclipse 中具体做到这一点的,我真的不知道——距离我上次使用 Eclipse 已经过去了 8 年,然后使用了不同于“标准”的构建系统。
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2018-11-19
  • 1970-01-01
  • 2012-06-01
  • 2013-04-03
  • 1970-01-01
  • 2020-12-07
  • 2018-12-19
相关资源
最近更新 更多