我在哪里可以找到 GLIBCXX_3.4.29?

Where can I find GLIBCXX_3.4.29?

我将我的 GCC 编译器从 GIT 存储库更新到版本 11。现在我的测试代码 (GoogleTest/GoogleMock) 抱怨找不到 GLIBCXX_3.4.29。 这不是重复的,请重新打开 答案张贴在: Understanding the gcc version and the GLIBC, GLIBCXX versions in more detail (2 answers) 没有回答问题。

链接器错误是:

/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?

构建 GCC 并安装二进制文件后,软链接 /usr/lib/x86_64-linux-gnu/libstdc++.so.6 未更新到最新版本。我的仍然指向上面评论中提到的以前的版本。在 GCC 构建目录下,我找到了 GLIBCXX_3.4.29 构建目录并将库复制到 /usr/lib/x86_64-linux-gnu 并更新了软链接。

当我运行

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

现在一切又开始正常了(暂时)。

快速解决

运行 export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH 在构建项目之前修复链接问题。考虑将此行添加到 ~/.bashrc 中以使其永久化

问题的答案

Where can I find 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 建议以下选项,这些选项在安装期间仅打印在同一消息中:

If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following:

  • add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution
  • add LIBDIR to the `LD_RUN_PATH' environment variable during linking
  • use the `-Wl,-rpath -Wl,LIBDIR' linker flag
  • have your system administrator add LIBDIR to `/etc/ld.so.conf'

就我个人而言,我发现修改 LD_LIBRARY_PATH 是最方便的方法(参见上面的 快速解决方案

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