GLIBCXX_3.4.21 未在带有链接时间参考的文件 libstdc .so.6 中定义

新手上路,请多包涵

抱歉,我知道与此非常相似的问题被问得比较频繁,尽管似乎没有一个解决方案对我有用。当尝试运行任何具有合理复杂性的 c++ 代码时,我得到了上述错误。完整的错误信息是:

 /main: relocation error: ./main: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

运行另一个项目,我得到一个非常相似的错误:

 ./main: relocation error: ./main: symbol _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

我实际上对编译没有任何问题,因为这些项目都编译得很好。这只是在我尝试运行可执行文件时发生。我认为这是我的 gcc 安装错误,所以今天我重新安装了它,尽管这根本没有帮助。我真的不知道该怎么做才能解决这个问题,有人可以提供帮助吗?

这是我用来编译其中一个项目的 Makefile,我觉得这可能是错误所在:

 CC= g++
CFLAGS= -Wall -g -std=c++11 -lX11 -lpthread
OBJS = main.o Board_Tile.o Sliding_Solver.o

main: $(OBJS)
   $(CC) -o $@ $(OBJS)
%.o : %.cc
   $(CC) $(CFLAGS) -c $^

我的 gcc 版本是 5.3.0,我正在运行 Ubuntu 14.0.4。

原文由 asharkdoctor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

GCC 5.1 或 5.2(现在不记得了,google it)改变了 C++ ABI。您的标准 ubuntu(包括 libstdc++)是使用旧 ABI 编译的。

您的 gcc 编译器尝试使用新的 ABI。有时它有效,大部分时间 - 不。

因此,有 3 种方法可以编译您的代码:

1)降级gcc

2)添加 -D_GLIBCXX_USE_CXX11_ABI=0 (cmake示例)标志(如果你这样做,你应该将此标志添加到你构建的每个makefile或项目中,直到你升级ubuntu或降级gcc)

  1. 升级 Ubuntu(经过测试,16.04 默认使用新的 ABI 和新的 gcc,我必须 ack-grep 并从我所有的宠物项目中删除上面提到的标志)

另外: 了解 GCC 5 的 _GLIBCXX_USE_CXX11_ABI 或新的 ABI

PS有趣的事情,答案就在问题中: _ZNSt7__cxx11 : CXX11 ,尽管我们并没有真正阅读错误消息。

原文由 strangeqargo 发布,翻译遵循 CC BY-SA 3.0 许可协议

所以我在 ubuntu 18.04 上遇到了同样的错误,这些是修复它的步骤:

  1. 运行它以检查缺少的内容
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

你会得到类似的东西

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_DEBUG_MESSAGE_LENGTH

然后运行:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test

sudo apt-get 更新

sudo apt-get install gcc-5

sudo apt-get 升级 libstdc++6

至少再次运行以确认更改

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

原文由 dannybastos 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题