7

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

4 回答 4

8

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

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

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

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

解决方案:

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

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

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

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

希望有帮助。

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

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

于 2011-08-22T16:37:49.090 回答
4

大学电脑上的版本libstdc++.so.6太旧了。你有两个选择:

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

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

$ LD_LIBRARY_PATH=$HOME/lib ./main

或者,如果您愿意

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

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

于 2011-08-22T17:01:24.327 回答
1

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

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

干杯,

于 2011-08-22T16:23:36.147 回答