GLIBCXX_3.4.21 未在具有 link 时间参考的文件 libstdc++.so.6 中定义

GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference

抱歉,我知道与此非常相似的问题被问得相对频繁,尽管 none 的解决方案似乎适用于 me.When 尝试 运行 任何 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,我是运行宁Ubuntu14.0.4.

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

您的 gcc 编译器尝试使用新的 ABI。有时它有效,但大多数时候 - 没有。

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

1) 降级 gcc

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

3) 升级 Ubuntu(测试过,顺便说一句,16.04 默认带有新的 ABI 和新的 gcc,我不得不 ack-grep 并从我所有的宠物项目中删除上面提到的标志)

还有:Understanding GCC 5's _GLIBCXX_USE_CXX11_ABI or the new ABI

P.S。有趣的是,答案在问题中:_ZNSt7__cxx11 : CXX11,尽管我们并没有真正阅读错误消息。

before_install:

在 运行 "extended" 具有 SASS 支持的 hugo 时,需要此解决方法来避免 libstdc++ 错误。

  • wget -q -O libstdc++6 http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.10_amd64.deb
  • sudo dpkg --force-all -i libstdc++6

    安装:

  • wget -q -O hugo.deb https://github.com/gohugoio/hugo/releases/download/v0.46/hugo_extended_0.46_Linux_64bit.deb

  • sudo dpkg -i hugo.deb

我找到了这个答案 here,它对我有用

更新 libstdc++6 下载 link 到:

http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.12_amd64.deb

所以我在 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 update

sudo apt-get install gcc-5

sudo apt-get upgrade libstdc++6

至少 运行 再次确认更改

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