/usr/lib/libstdc++.so.6:找不到版本“ GLIBCXX_3.4.15”


135

如何在Ubuntu中获得GLIBCXX_3.4.15?我无法运行正在编译的某些程序。

当我做:

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

我得到:

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
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

谢谢你的帮助!

Answers:


81

我正在从源代码编译gcc 4.6,显然

sudo make install 

没有抓住这个。我四处寻找

gcc/trunk/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.15

我将其复制到/ usr / lib并重定向libstdc ++。so.6以指向新的目录,现在一切正常。


1
我遇到了同样的问题,而这个帖子/答案正是我想要的。非常感谢!
2011年

1
除libstdc ++。so.6.0.16外,它还适用于gcc 4.6.2。谢谢!
Venesectrix'2

2
我的是gcc 4.7和libstdc ++。so.6.0.17。遇到了相同的问题,此解决方案已解决。荣誉
Ricbit

1
就在这里。一apt-get:基于解决这个问题,这里描述 superuser.com/questions/310809/...
aroth

4
@roosevelt:这不是操作系统的问题,而是用户自己安装软件然后没有正确使用链接器的问题。这是一个常见问题解答:gcc.gnu.org/onlinedocs/libstdc++
faq.html#

54

在过去,我一直在通过链接可执行文件时简单地将libstdc ++与发送给g ++的此参数静态地静态链接来避免此问题:

-static-libstdc++

如果可以选择静态链接库,则可能是最快的解决方法。


2
非常感谢,我尝试了关于SO的所有其他建议解决方案,但只有这一解决方案有效。
Itamar Katz 2014年

1
感谢您的解决方案,它对我有很大帮助!
Brightshine

问题是找不到该库,而不是应该静态链接。请参阅@Hobo的答案。
丹·梅根斯

45

我试图让clang正常工作(也需要6.0.15),并且四处寻找时发现它已安装在 /usr/local/lib/libstdc++.so.6.0.15。当我安装石墨(实验性gcc版本)时,它就安装在这里。

如果需要访问该位置的库,则需要定义LD_LIBRARY_PATH为:

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

完成此操作后,我便可以使用clang了。希望对某人有帮助。


我在嵌入式目标上工作,但遇到了同样的问题,在我的情况下,您的解决方案似乎不起作用。实际上,目标中的大多数二进制文件都使用/ lib中的默认c库,因此更改LD_LIBRARY_PATH将影响它们。它们都将链接到新库,最后大多数二进制文件不起作用:例如ls grep,....:我得到了:ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
Mouin

14

尝试使用Matlab eng从C代码调用m函数时遇到此问题。通过命令发生mex -f .. ..

我的解决方案:

strings /usr/lib/i386-<tab>/libstdc++.so.6 | grep GLIBC

我发现它包含3.4.15

所以我的系统具有最新的库。

问题来自于matlab本身,它从以下位置调用了自己的libstdc ++。so.6 {MATLAB}/bin

因此,只需将其替换为更新的系统库。


这似乎也适用于我在Xubuntu 13.04 x64上的Matlab 2013b x64中
Marcin

非常感谢。我只是在创建一个新的符号链接文件{MATLAB}/bin到文件/usr/lib/,然后重新启动 MATLAB。在Fedora 14 x64上的Matlab 2010b中可以使用。
2013年

2

我有同样的错误。这对我来说是这样的:

  • 在当前安装的gcc下清理了项目
  • 重新编译

工作完美!


2

对于此错误,我从其他服务器复制了最新的libstdc ++。so.6.0.17,然后删除了软链接并重新创建了它。

1.将libstdc ++。so.6.0.15或最新版本从其他服务器复制到受影响的系统。
就我而言,SUSE linux 11 SP3是最新的。
2. rm libstdc ++。so.6
3. ln -s libstdc ++。so.6.0.17 libstdc ++。so.6(在/ usr / lib64目录下)。

欢乐


2

我刚遇到构建LLVM 3.7版本的类似问题。首先检查您的系统上是否已安装所需的库:

$locate libstdc++.so.6.*

然后将找到的位置添加到$ LD_LIBRARY_PATH环境变量中。


2
仅当您具有具有GLIBCXX_3.4.15支持的libstdc ++。so.6。* lib时,此方法才有效
warunapww

2

有时您无法控制目标计算机(例如,您的库需要在锁定的企业系统上运行)。在这种情况下,您将需要使用与其GLIBCXX版本相对应的GCC版本重新编译代码。在这种情况下,您可以执行以下操作:

  1. 查找目标计算机支持的最新版本的GLIBCXX:strings /usr/lib/libstdc++.so.6 | grep GLIBC...说该版本为3.4.19
  2. 使用https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html查找相应的GCC版本。在我们的情况下,这是[4.8.3, 4.9.0)

1

gcc版本4.8.1,错误似乎是:

/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen:/usr/lib64/libstdc++.so.6:找不到版本'GLIBCXX_3.4.15'(/ root / bllvm / build / Release + Asserts / bin / llvm-tblgen)

我在符合gcc 4.8.1的地方找到了libstdc ++。so.6.0.18

那我就这样

cp ~/objdir/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/

rm /usr/lib64/libstdc++.so.6

ln -s libstdc++.so.6.0.18 libstdc++.so.6

问题解决了。


1

我从RPM(libstdc ++的RPM)中提取了它们,然后:

export LD_LIBRARY_PATH=.

设置系统以搜索当前目录上的库。然后刚执行我的程序。但就我而言,我已经收到了所需的单个可执行文件,这不是系统范围的更改。


0

我遇到了类似的问题,并且通过静态链接libstdc++到正在编译的程序中来解决了该问题,如下所示:

$ LIBS=-lstdc++ ./configure ... etc.

而不是通常的

$ ./configure ... etc.

这种解决方案可能与在运行时加载共享库有关,但是我没有深入研究这个问题以进行评论。



0

我遇到了同样的问题,因为我将用户从自己更改为其他人:

su

由于某种原因,在正常编译之后,我无法执行它(相同的错误消息)。直接ssh到其他用户帐户即可。


这并不能真正回答问题。如果您有其他问题,可以点击提问进行提问。您还可以添加赏金,以吸引更多对此问题的关注。
ravron 2015年

不,因为我有完全相同的问题。这是由更改用户引起的。换成root,这也可能发生在其他人身上。
HelloWorld

我的错!我被第一行所吸引,看起来您也遇到了问题。继续!
ravron 2015年

我也使用过Ubuntu,还尝试编译程序,并且得到与问题中相同的错误消息。我的错误是我正在使用su命令在另一个用户帐户中执行此操作。我认为这回答了这个问题,因为它解决了问题的原因和原因。当然有可能。
HelloWorld

并为一个用户设置了LD_LIBRARY_PATH来查找较新的库,而另一用户没有?在这个问题的具体背景下,这似乎有些牵强。
Marc Glisse 2015年

0

我安装了多个版本的gcc编译器,并且需要使用比默认安装更新的版本。由于我不是Linux系统的系统管理员,因此我不能只更改/ usr / lib或上面的许多其他建议。我遇到了这个问题,并最终将其追溯到将我的路径设置为32位库目录而不是64位库(lib64)目录。由于32位目录中的库不兼容,因此系统默认使用的是较旧的旧版本。

在我所引用的路径上使用-L会发出有关“在搜索-lstdc ++时跳过不兼容的libstdc ++。so”的警告。这是帮助我最终解决问题的提示。


0

与gcc版本4.8.1 (GCC)和相同libstdc++.so.6.0.18。不得不将其复制/usr/lib/x86_64-linux-gnu到我的Ubuntu盒子上。


0

在我的情况下,LD_LIBRARY_PATH在/ usr / local / lib64之前先具有/ usr / lib64。(我正在构建llvm 3.9)。
我安装的用于编译llvm 3.9的新gcc编译器在/ usr / local / lib64下使用了较新的GLIBCXX库,因此我修复了LD_LIBRARY_PATH,以使链接程序首先查看/ usr / local / lib64。
那解决了这个问题。


0

我只是在构建时使用-static-libstdc ++。瓦特那,我可以运行a.out

g++ test.cpp -static-libstdc++

0

出于测试目的:

在原始计算机上,找到该库,并将其复制到可执行文件所在的目录:

$ ldconfig -p | grep libstdc
        libstdc++.so.6 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
        libstdc++.so.6 (libc6) => /usr/lib32/libstdc++.so.6
$ cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6 .

然后将该同一个库复制到目标计算机,并运行可执行文件:

LD_LIBRARY_PATH=. ./myexecutable

注意:上面的命令是临时的;这不是系统范围的更改。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.