当我使用g++在我的计算机上编译一个c++程序并传输可执行文件以在我的大学服务器上运行它时,我得到
./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)该程序在我的计算机上运行良好,并且我没有在我的大学服务器上安装任何新软件的特权。
有什么帮助吗?谢谢
发布于 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)是一个不是很好但更完整的库描述。
发布于 2011-08-23 00:23:23
大学计算机上的libstdc++.so.6版本太旧。您有两个选择:
-static静态链接。然后,C++库将被合并到最终的二进制文件中。-rpath /path/to/library/directory或将LD_LIBRARY_PATH环境变量设置为指向包含较新版本的目录来引用它发布于 2011-08-23 01:01:24
您可以将您的/usr/lib/libstdc++.so.6版本复制到服务器主目录的子目录中,例如~/lib,然后运行:
$ LD_LIBRARY_PATH=$HOME/lib ./main或者如果你喜欢
$ export LD_LIBRARY_PATH=$HOME/lib
$ ./main并且程序应该加载您的私有库,而不是系统库。
https://stackoverflow.com/questions/7150409
复制相似问题