libstdc++ GLIBCXX版本错误



当我使用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)

这个程序在我的电脑上运行得很好,而且我没有特权在我的大学服务器上安装任何新软件。

有什么帮助吗?由于

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

所以你的链接器只是解析了一些符号并做了另一个操作,而不是真正的"链接"库,而延迟了库的实际加载到运行时。

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

这里的问题是,你在家里链接你的程序与一个版本的标准库,这是不一样的版本,你在大学。因此,当加载器试图找到库时,它会失败,因此您的程序无法运行。

解决方案:

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)有一个不太好但更完整的库描述

学校电脑上的libstdc++.so.6版本太老了。您有两个选项:

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

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

$ LD_LIBRARY_PATH=$HOME/lib ./main

或者

$ export LD_LIBRARY_PATH=$HOME/lib
$ ./main

程序应该加载你的私有库而不是系统库

您尝试为哪些平台进行编译?即。"你的电脑"one_answers"大学服务器"?

你可以尝试用静态链接选项编译你的程序。这将生成一个静态链接的可执行文件,其中已经加载了所有的库依赖项。

欢呼,