【问题标题】:libstdc++ GLIBCXX version errorslibstdc++ GLIBCXX 版本错误
【发布时间】:2011-08-22 16:17:44
【问题描述】:

当我在我的计算机中使用 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)

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

有什么帮助吗? 谢谢

【问题讨论】:

  • 大学里​​的libstdc++版本是什么?
  • @phoxis,似乎是 3.4.8 或更高版本。

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


【解决方案1】:

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

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

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

这里的问题是,您在家中的程序与 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) 有一个不太好但更完整的库描述。

【讨论】:

  • -static 更好的选择是-static-libstdc++,它只静态链接libstdc++,而不是整个程序。
【解决方案2】:

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

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

【讨论】:

  • 非常感谢 bdonian,在大学服务器中执行静态链接是否会使程序运行速度变慢?
  • @Tarek,静态链接有各种优点和缺点,但我认为你不会看到太大的速度差异,真的。
  • 正如@bdonian 所说,有很多优点和缺点,但在你的情况下,主要的就是尺寸。静态链接的程序比动态链接的程序大,因为在静态链接的程序中,库被“包含”在可执行文件中。
  • -static 更好的选择是-static-libstdc++,它只静态链接libstdc++,而不是整个程序。
【解决方案3】:

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

$ LD_LIBRARY_PATH=$HOME/lib ./main

或者如果你喜欢

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

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

【讨论】:

    【解决方案4】:

    您要针对哪些平台进行编译?即“您的计算机”和“大学服务器”?

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

    干杯,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      相关资源
      最近更新 更多