当我使用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)
Run Code Online (Sandbox Code Playgroud)
该程序在我的计算机上运行良好,我没有权限在我的大学服务器上安装任何新软件.
任何帮助?谢谢
在家中链接程序时,您似乎使用标准库作为共享库(默认行为).
因此,链接器只是解析一些符号并执行另一个操作,而不是真正"链接"库,而是将库的实际加载延迟到运行时.
当您在大学计算机上执行程序时,加载程序(实际将程序加载到内存并抛出主线程的程序)会查找程序所需的库并尝试加载它们(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)一个不太好但更完整的图书馆描述.