我将 GCC 编译器从 GIT 存储库更新到版本 11。现在我的测试代码(GoogleTest/GoogleMock)抱怨找不到 GLIBCXX_3.4.29。 这不是重复的,请重新打开 答案发布于: 更详细地了解gcc版本和GLIBC、GLIBCXX版本(2个答案) 没有回答问题。
链接器错误是:
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.29 not found
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_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH
在哪里可以找到 3.4.29?
sudo add-apt-repository ppa:ubuntu-toolchain-r/test # Ignore if not ubuntu
sudo apt-get update
sudo apt-get install gcc-4.9
sudo apt-get upgrade libstdc++6
完成后,请确保运行以下命令:
sudo apt-get dist-upgrade
此外,请确保确认已安装正确的 GLIBCXX 版本所需的依赖项。
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
还可以尝试@bobka 的快速解决方案
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH # add to ~/zshrc OR bashrc whatever
构建 GCC 并安装二进制文件后,软链接 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 未更新到最新版本。我的仍然指向上面评论中提到的以前的版本。在 GCC 构建目录下,我找到了 GLIBCXX_3.4.29 构建目录,并将库复制到 /usr/lib/x86_64-linux-gnu 并更新了软链接。
在构建项目之前运行
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
以修复链接问题。考虑将这一行添加到~/.bashrc
中以使其永久
在哪里可以找到 3.4.29?
当您从源代码安装 gcc 时,即运行
sudo make install
,您可能会看到如下消息:
Libraries have been installed in:
/usr/local/lib/../lib64
因此,所需的 GLIBCXX 版本包含在 /usr/local/lib64/libstdc++.so.6 中(实际上是 libstdc++.so.6.0.29 的符号链接)。您可以通过运行
strings /usr/local/lib64/libstdc++.so.6 | grep GLIBCXX_3.4.29
来验证这一点
虽然您可以手动更新符号链接,但我认为这不是一种安全且推荐的方法。 GCC 建议使用以下选项,这些选项在安装过程中仅打印在同一条消息中:
如果您碰巧想要链接已安装的库 在给定目录 LIBDIR 中,您必须使用 libtool,并且 指定库的完整路径名,或使用“-LLIBDIR” 在链接期间标记并至少执行以下操作之一:
- 将 LIBDIR 添加到`LD_LIBRARY_PATH'环境变量 执行过程中
- 将 LIBDIR 添加到`LD_RUN_PATH'环境变量中 链接期间
- 使用 `-Wl,-rpath -Wl,LIBDIR' 链接器标志
- 让您的系统管理员将 LIBDIR 添加到 `/etc/ld.so.conf'
就我个人而言,我发现修改LD_LIBRARY_PATH是最方便的方法(参见上面的快速解决方案)
当我跑步时
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
我清楚地看到GLIBCXX_3.4.29
当我搜索时
find / -name "libstdc++.so*"
它返回了很多路径 - 但特别是我的 torch conda 环境有一个重复的......
/home/jp/miniconda3/envs/torch/lib/libstdc++.so
/home/jp/miniconda3/envs/torch/lib/libstdc++.so.6.0.21
/home/jp/miniconda3/envs/torch/lib/libstdc++.so.6.0.28
/home/jp/miniconda3/envs/torch/lib/libstdc++.so.6
我只是删除了多余的文件
sudo rm /home/jp/miniconda3/envs/torch/lib/libstdc++.so.6.0.21
现在一切又开始运转了(暂时)。
如果您尝试构建 Dockerfile,我最终从
ubuntu:20.04
切换到 ubuntu:22.04
作为基础映像以获得正确的 GLIBCXX_
版本。
我转到 /usr/lib/x86_64-linux-gnu/ 文件夹,复制 libstdc++.so.6.0.29 并将其粘贴到 /home/xx/anaconda3/bin/ 和 /home/xx/anaconda3/lib ,它工作了.
简短的回答是,我通过导出路径解决了这个问题。
我也有同样的错误。我的情况比较特殊,因为我使用的是共享 GPU,这限制了我对与正在运行的 Conda 关联的 Conda 包进行修改的能力。但是,我确实有能力安装自己的软件包并导出路径。当我执行 Python 时,它会查找默认的 Conda 路径(我没有写入权限的路径),而不是我安装这些包的路径。
首先我找到了libstdc++.so.6.xxxx
find /home/liang142 -name "libstdc++.so*"
它将返回一个列表
/home/liang142/.conda/pkgs/libgcc-5.2.0-0/lib/libstdc++.so
/home/liang142/.conda/pkgs/libgcc-5.2.0-0/lib/libstdc++.so.6
/home/liang142/.conda/envs/cent7/2020.11-py38/myenv/x86_64-conda-linux-gnu/lib/libstdc++.so
/home/liang142/.conda/envs/cent7/2020.11-py38/myenv/x86_64-conda-linux-gnu/lib/libstdc++.so.6
/home/liang142/.conda/envs/cent7/2020.11-py38/myenv/x86_64-conda-linux-gnu/lib/libstdc++.so.6.0.29
然后我发现了一个包含 GLIBCXX_3.4.29 包的 libstdc++.so.6.xxxx 版本
strings /home/liang142/.conda/envs/cent7/2020.11-py38/myenv/lib/libstdc++.so.6.0.32 | grep GLIBCXX_3.4.29
然后我只需导出该特定库的路径(对于我的情况为 libstdc++.so.6.0.32)
export LD_LIBRARY_PATH=/home/liang142/.conda/envs/cent7/2020.11-py38/myenv/lib/:$LD_LIBRARY_PATH