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)
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 并更新了软链接。
小智 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 是最方便的方法(请参阅上面的快速解决方案)
当我跑的时候
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)
现在一切又开始运转了(暂时)。