在哪里可以找到 GLIBCXX_3.4.29?

Jam*_*s S 55 c++ gcc libstdc++

我将 GCC 编译器从 GIT 存储库更新到版本 11。现在我的测试代码 (GoogleTest/GoogleMock) 抱怨找不到 GLIBCXX_3.4.29。 这不是重复的,请重新打开 发布在: Understanding the gcc version and the GLIBC, GLIBCXX versions in more detail (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
Run Code Online (Sandbox Code Playgroud)

在哪里可以找到 3.4.29?

小智 33

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
Run Code Online (Sandbox Code Playgroud)

完成后,请确保运行以下命令:

sudo apt-get dist-upgrade
Run Code Online (Sandbox Code Playgroud)

另外,请确保确认已安装正确的 GLIBCXX 版本所需的依赖项。

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
Run Code Online (Sandbox Code Playgroud)

另请尝试@bobka 的快速解决方案

export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH # add to ~/zshrc OR bashrc whatever
Run Code Online (Sandbox Code Playgroud)

  • 在 Debian 11 上对我不起作用 (5认同)

Jam*_*s S 20

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

  • 最有可能的是 `make install` 将 `libstdc++.so.` 安装到了 `/usr/local/lib` 中,这不适合您的系统。 (3认同)

小智 11

快速解决方案

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
Run Code Online (Sandbox Code Playgroud)

因此,所需的 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 是最方便的方法(请参阅上面的快速解决方案


joh*_*ope 6

当我跑的时候

strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
Run Code Online (Sandbox Code Playgroud)

我清楚地看到 GLIBCXX_3.4.29

当我搜索时

find / -name "libstdc++.so*"
Run Code Online (Sandbox Code Playgroud)

它返回了很多路径 - 但具体来说我的火炬 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
Run Code Online (Sandbox Code Playgroud)

我只是删除了多余的文件

sudo rm /home/jp/miniconda3/envs/torch/lib/libstdc++.so.6.0.21
Run Code Online (Sandbox Code Playgroud)

现在一切又开始运转了(暂时)。