首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libstdc++ GLIBCXX版本错误

libstdc++ GLIBCXX版本错误
EN

Stack Overflow用户
提问于 2011-08-23 00:17:45
回答 4查看 13.7K关注 0票数 7

当我使用g++在我的计算机上编译一个c++程序并传输可执行文件以在我的大学服务器上运行它时,我得到

代码语言:javascript
复制
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main)
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main)

该程序在我的计算机上运行良好,并且我没有在我的大学服务器上安装任何新软件的特权。

有什么帮助吗?谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-23 00:37:49

当你在家中链接你的程序时,你似乎正在使用标准库作为共享库(默认行为)。

因此,您的链接器并没有真正“链接”库,而只是解析一些符号并执行另一个操作,同时将库的实际加载延迟到运行时。

当你在你的大学计算机上执行你的程序时,装载器(在内存中实际装入你的程序并抛出主线程的程序)寻找你的程序需要的库并尝试装入它们(如果你感到好奇,可以在linux中查找LD_LIBRARY_PATH )。

这里的问题是,您在家中将程序链接到的stdlib版本与您在大学中拥有的版本不同。因此,当加载程序尝试查找该库时,它会失败,因此您的程序无法运行。

解决方案:

a)为了避免所有这些问题,请使用静态链接而不是动态链接。我不确定使用stdlib是否可以做到这一点,但我认为值得对其进行测试(参见:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html并查找"-static“标志)

b)你可以尝试在你的大学计算机上编译你的程序,这样它就会使用那里的版本。

c)尝试了解那里安装了哪个stdlib版本,并在您的编译器机器上安装相同的版本。

d)您可以尝试将stdlib的主版本复制到应用程序所在的文件夹中。这通常是因为加载器倾向于在查找环境变量LD_LIBRARY_PATH (linux)中设置的路径之前,先在当前应用程序文件夹中搜索共享库。

希望这能有所帮助。

附言:这里很好地介绍了静态与共享/动态库http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

这里(http://en.wikipedia.org/wiki/Library_%28computing%29)是一个不是很好但更完整的库描述。

票数 8
EN

Stack Overflow用户

发布于 2011-08-23 00:23:23

大学计算机上的libstdc++.so.6版本太旧。您有两个选择:

  1. -static静态链接。然后,C++库将被合并到最终的二进制文件中。
  2. 将正确的版本复制到主目录中的某个位置,然后通过在构建时传递-rpath /path/to/library/directory或将LD_LIBRARY_PATH环境变量设置为指向包含较新版本的目录来引用它
票数 4
EN

Stack Overflow用户

发布于 2011-08-23 01:01:24

您可以将您的/usr/lib/libstdc++.so.6版本复制到服务器主目录的子目录中,例如~/lib,然后运行:

代码语言:javascript
复制
$ LD_LIBRARY_PATH=$HOME/lib ./main

或者如果你喜欢

代码语言:javascript
复制
$ export LD_LIBRARY_PATH=$HOME/lib
$ ./main

并且程序应该加载您的私有库,而不是系统库。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7150409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档