libstdc ++。so.6:找不到版本GLIBCXX_3.4.20

时间:2018-12-03 11:23:44

标签: c++ gcc version std glibc

首先,要知道我对c ++和Ubuntu非常陌生。

我有一个程序正在尝试使用Makefile使用GCC(我的版本是gcc 4.8.4)进行编译。 问题在于可执行文件是在它可以使用的目录下创建的,但是当将其复制到其他文件(甚至被迫在makefile上创建)时,它会说。

/usr/lib/i386-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 

也当我检查带有字符串/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_DEBUG_MESSAGE_LENGTH

据我一直在网上阅读的问题是,在我使用4.8.4时,gcc 4.9及更高版本仅支持GLIBCXX_3.4.20,但仍然不知道为什么它可以在特定目录,而不是其他目录。

gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4) 

由于我没有更新gcc的权限,因此我想知道该怎么办才能解决此问题... 在需要GLIBCXX_3.4.20的代码上应该避免使用哪些东西? 我是否可以强制编译器以某种方式使用该库的旧版本,或者将该特定库包含在二进制文件中? (我不明白如果没有所需的库,为什么它也可以在目录中工作)

先谢谢您,如果我的问题很愚蠢或没有道理,就像我说的那样,我很新。

2 个答案:

答案 0 :(得分:0)

  

我一直在尝试注释和取消注释代码的所有部分,并且得到了答案,即string.find()函数给我带来了麻烦。

愤怒的活动不能代替理解。

从您描述的症状来看,很明显,您拥有libstdc++.so.6的两个单独版本,并且程序在特定目录中运行时绑定到一个版本,而在该目录之外运行时绑定到另一个版本。

然后您的第一个任务是确定何时使用的libstdc++.so.6版本。您可以执行以下操作:

cd /path/to/specific/directory
LD_DEBUG=files,libs /path/to/binary ...args...

并将输出与

进行比较
cd /tmp
LD_DEBUG=files,libs /path/to/binary ...args...

一旦您知道运行libstdc++.so.6的路径,就需要弄清楚为什么仅在某些时间而不是所有时间都在使用它。

常见原因包括在LD_LIBRARY_PATH环境变量(错误),二进制文件本身的RPATHRUNPATH中具有 relative 路径,或者它所依赖的库之一。

您可以通过以下方式检查RPATH

readelf -d /path/to/binary | egrep 'RPATH|RUNPATH'

您的最后一步应该是摆脱相对路径(无论它们来自何处-从来都不是一个好主意),并安排正确版本的libstdc++.so.6 (通常是通过在链接时提供-Wl,-rpath=/path/to/desired/directory来获得 allways )。

完成此操作后,无论从哪个目录调用程序,程序都应正常运行。

答案 1 :(得分:0)

wget https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz

tar xvf gcc-10.2.0.tar.gz
cd gcc-10.2.0
mkdir -p /mnt/distvol/opt/gcc/10.2.0
./configure --with-system-zlib --disable-multilib --enable-languages=c,c++ --prefix=/mnt/distvol/opt/gcc/10.2.0
make -j 2
make install
ln -s /mnt/distvol/opt/gcc/10.2.0/bin/* /usr/bin/ -f
mv /usr/bin/lib64/libstdc++.so.6 /usr/bin/lib64/libstdc++.so.6.bak
strings $(find /mnt/distvol/opt/gcc/10.2.0/ -name "libstdc++.so.6") | grep GLIBCXX_3.4.
ln -s /mnt/distvol/opt/gcc/10.2.0/lib64/libstdc++.so.6 /usr/bin/lib64/libstdc++.so.6