libstdc++.so.6:未找到版本 GLIBCXX_3.4.20
Posted
技术标签:
【中文标题】libstdc++.so.6:未找到版本 GLIBCXX_3.4.20【英文标题】:libstdc++.so.6: version GLIBCXX_3.4.20 not found 【发布时间】:2019-05-04 16:34:27 【问题描述】:首先,要知道我对 c++ 和 Ubuntu 很陌生。
我有一个程序,我正在尝试使用 GCC(我的版本是 gcc 4.8.4)通过 makefile 进行编译。 问题是可执行文件是在它工作的目录下创建的,但是当它复制到任何其他目录时(甚至强制在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
据我一直在互联网上阅读,问题是 GLIBCXX_3.4.20 仅在我使用 4.8.4 时受 gcc 4.9 及更高版本支持,但我仍然不明白为什么它会在特定目录而不是其他目录。
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)
由于我没有更新 gcc 的权限,我想知道我能做些什么来解决这个问题... 我应该避免在需要 GLIBCXX_3.4.20 的代码上使用哪些东西? 我可以强制编译器以某种方式使用该库的旧版本或在二进制文件中包含该特定库吗? (如果我没有所需的库,我不明白为什么它会在目录中工作)
提前感谢,如果我的问题很愚蠢或没有意义,我很抱歉,因为我说过我对这一切都很陌生。
【问题讨论】:
看来你的 32 位和 64 位版本有问题。 怀疑我们可以在无法看到系统或至少更多信息的情况下回答这个问题。你说它只在一个目录中有效,但不告诉我们那个目录是什么,它在哪里,或者里面有什么? 系统是64位的,目录是通用目录,二进制文件是在我公司自动生成的。如果我按照人们用来移动可执行文件的方式执行 ls 命令,那么该目录上就没有更多内容了。 我一直在尝试对代码的所有部分进行注释和取消注释,我得到的答案是函数 string.find() 是给我带来麻烦的那个。尝试将所有 find() 更改为 strstr 和 strchar 并且问题在我告诉的目录上有效,但在外部运行时仍然存在问题... 【参考方案1】:我一直在尝试对代码的所有部分进行注释和取消注释,我得到的答案是函数 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
环境变量(错误)、二进制文件本身的RPATH
或RUNPATH
或它所依赖的库之一中存在相对 路径开。
您可以通过这种方式检查RPATH
:
readelf -d /path/to/binary | egrep 'RPATH|RUNPATH'
您的最后一步应该是摆脱相对路径(无论它们来自哪里——它们从来没有一个好主意),并安排选择正确版本的libstdc++.so.6
up总是(通常在链接时提供-Wl,-rpath=/path/to/desired/directory
)。
完成此操作后,无论您从哪个目录调用程序,您的程序都应该可以正常工作。
【讨论】:
【参考方案2】: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
【讨论】:
以上是关于libstdc++.so.6:未找到版本 GLIBCXX_3.4.20的主要内容,如果未能解决你的问题,请参考以下文章
如何手动设置使用哪个版本'libstdc++.so.6'而不是使用最新版本?
ldd 可执行文件如何找到 /usr/lib64/libstdc++.so.6?
ld.so.1:协议:致命:libstdc++.so.6:在 Solaris 11 中找不到版本“GLIBCXX_3.4.20”