22

我有一个关于libstdc++.so.

我安装了新版本的 gcc 并尝试编译 C++ 代码。编译工作,但是当我尝试执行二进制文件(m5.opt是它的名字)时,我得到了以下错误:

build/ALPHA_SE/m5.opt: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by build/ALPHA_SE/m5.opt).

我需要更换libstdc++.so吗?如果是这样,我在哪里可以下载我想要的版本?在 GCC 网站上,他们说 libstdc++ 现在是 gcc 的一部分。

细节

GCC:我之前有 gcc 4.1.2,但我下载了 gcc 4.2.4。从我执行的未解压的 gcc 目录中./configure;制作; 须藤使安装`。当我尝试使用 gcc 或 g++ 编译时,它的默认版本仍然是 4.1.2。为了克服这个问题,我替换了一些链接:

mv /usr/bin/gcc /usr/bin/gcc_bak
ln -s /usr/local/bin/gcc gcc
mv /usr/bin/g++ /usr/bin/g++_bak
ln -s /usr/local/bin/g++ g++

GLIBC(++) -- libstdc++:

/usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.8
/usr/local/lib/libstdc++.so -> libstdc++.so.6.0.9
/lib/libc.so.6 -> libc-2.5.so -> libc-2.5.so

Linux版本: uname -a给出:

Linux madmax 2.6.18-128.4.1.el5 #1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

4

3 回答 3

27

问题是您GCC错误地构建了新的:在 Linux 上,您应该使用

./configure --prefix=/usr

默认安装前缀是/usr/local,这就是为什么make install将二进制文件放入gcc等。g++/usr/local/bin

现在发生在您身上的是您使用新的 (symlinked) 编译和链接GCC 4.2.4,但在运行时您的程序绑定到旧的/usr/lib64/libstdc++.so.6(版本 6.0.8,而不是必需的 6.0.9)。您可以通过运行来确认ldd build/ALPHA_SE/m5.opt:您应该看到它使用/usr/lib64/libstdc++.so.6.

你可以做几个修复。

env LD_LIBRARY_PATH=/usr/local/lib64 ldd build/ALPHA_SE/m5.opt

应该向您展示该设置LD_LIBRARY_PATH足以将二进制文件重定向到正确的库,并且

LD_LIBRARY_PATH=/usr/local/lib64 build/ALPHA_SE/m5.opt

应该运行。您可以将此路径“烘焙”到 m5.opt 二进制文件中,方法是使用-Wl,-rpath=/usr/local/lib64.

更持久的解决方案是像修复二进制文件一样修复库:

cd /usr/lib64 && mv libstdc++.so.6 libstdc++.so.6_bak &&
ln -s /usr/local/lib64/libstdc++.so.6 .

一个更好的解决方案是重新配置新GCC--prefix=/usr,然后make all install

于 2009-12-26T21:18:15.090 回答
8

我知道这是一个非常古老的问题,但是......

替换系统编译器(即 中的编译器)通常不是一个好主意,/usr因为整个系统都将使用它构建并依赖它。

通常最好将新编译器安装到单独的位置,然后查看 libstdc++ 常见问题解答如何确保找到动态链接库?并在手册中查找动态或共享库,了解如何确保在运行时找到正确的 libstdc++.so。

于 2012-06-22T21:39:42.277 回答
5

这里的其他答案应该没问题,但是如果您碰巧将 gcc 安装到 /usr/local/ ,那么“快速简单”的解决方案就是将新库添加到 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

您还可以使用以下方法检查您是否安装了正确版本的 GLIBC

strings /usr/lib/libstdc++.so.6 | grep GLIBC
strings /usr/local/lib64/libstdc++.so.18 | grep GLIBC

我从另一个论坛得到了最后一个提示,所以学分到期的地方!

于 2014-04-22T19:16:25.800 回答