2011-08-22 128 views
7

当我用g ++以及传送可执行文件到我的大学的服务器上运行它在我的电脑编译C++程序,我得到的libstdC++ GLIBCXX版本错误

./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) 

程序运行以及我的电脑上,和我不没有权利在我的大学服务器上安装任何新软件。

有帮助吗? 谢谢

+0

什么是大学的libstdC++版本? – phoxis

+0

@phoxis,3.4.8或更老,似乎。 – bdonlan

回答

7

好像在家里连接你的程序时,您使用的是标准库作为共享库(默认行为)。

因此,链接器并不是真的“链接”库,而是只是解析了一些符号并执行了另一个操作,而延迟了库的实际加载时间。

当你在你的大学计算机上执行你的程序时,加载器(实际加载你的程序在内存中并抛出主线程的程序)寻找你的程序需要的库,并尝试加载它们(在Linux中寻找LD_LIBRARY_PATH如果你觉得好奇)。

这里的问题在于,你在家中将你的程序与stdlib的版本链接起来,该版本的版本与你在大学时的版本不同。所以当加载器试图找到库时,它会失败,所以你的程序不能运行。

解决方案:

一)为了避免这些问题,使用静态链接,而不是动态链接。我不确定stdlib是否可行,但我认为它是值得测试的(请参阅:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html并查找“-static”标志)

b)您可以尝试在大学计算机上编译程序所以它会使用那里的版本。

c)试着知道哪个stdlib版本安装在那里,并在你的编译器中安装相同的版本。

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

希望有所帮助。

P.S: 这里有一个很好的介绍,以静VS共享/动态库http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

和这里(http://en.wikipedia.org/wiki/Library_%28computing%29)不那么好,但更完整的库描述。

+1

比'-static'更好的选择是'-static-libstdC++',它只静态链接libstdC++,而不是整个程序。 –

4

libstdc++.so.6的版本在大学计算机上太旧了。你有两种选择:

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

非常感谢bdonian,在大学服务器上运行时静态链接是否会使程序运行速度变慢? – Tarek

+0

@Tarek,静态链接有各种优点和缺点,但我不认为你会看到很大的速度差异,真的。作为@bdonian说 – bdonlan

+0

有许多优点和缺点,但在你的情况下,主要的将是规模。静态链接的程序比动态链接的程序大,因为在静态链接的程序中,库被“包含”在可执行文件中。 – thamurath

1

您试图编译哪些平台?即“您的电脑”和“大学服务器”?

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

干杯,

3

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

$ LD_LIBRARY_PATH=$HOME/lib ./main 

或者如果你喜欢

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

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