libstdc ++ GLIBCXX版本错误

时间:2011-08-22 16:17:45

标签: c++ g++ libstdc++

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

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

任何帮助? 感谢

4 个答案:

答案 0 :(得分:7)

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

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

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

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

<强>解决方案:

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

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

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

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

希望有所帮助。

P.S .: 在这里,您可以很好地了解静态与共享/动态库http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

$ LD_LIBRARY_PATH=$HOME/lib ./main

或者如果您愿意

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

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

答案 3 :(得分:1)

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

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

干杯,