如何在旧版本的gcc系统上动态链接到libc.so.6,libstdc .so.6的本地副本

我的代码是用c编写的,用g 4.8编译.但是,我的系统管理员不会从
gcc / g 4.1升级计算群集.我收到以下错误:

/lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./ManRegOptDes)
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.17' not found (required by ./ManRegOptDes)
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./ManRegOptDes)
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./ManRegOptDes)
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.13' not found (required by ./ManRegOptDes)
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./ManRegOptDes)
/usr/lib64/libstdc++.so.6: version `CXXABI_1.3.3' not found (required by /lib/intel/tbb/lib/intel64/gcc4.4/libtbb.so.2)

是否可以将gcc / g 4.8版本的libc.so.6,libstdc .so.6复制到集群上的用户目录中,以便我的程序动态链接到它们?如果是这样,我设置哪个环境变量,以便我的可执行文件可以动态链接到它们?

谢谢.

最佳答案

Can you copy these files?

是.
对象库是普通文件,与其他文件一样.
当然,当sysadmin使它们可用时,你最终会想要挂钩官方库.

对象库有两种形式…… .a(存档)和.so(共享对象)
如果将它们复制到同一个人目录,gcc链接器将默认选择.a而不是.a.

if so, which environment variable(s) to i set [sic]

我认为您不必担心标准的LIBRARY_PATH或PATH条目,直到您需要交付,或者直到lib64变为“正式”可用.解开临时路径修改等比执行以下操作更难吗?

可能,将您想要的库复制到您自己的目录中

      /home/uname/my_lib64

变得

> … / my_lib64 / libc.so.6
> … / my_lib64 / libstdc .so.6

> -L / home / uname / my_lib64

你的’final’编译命令让gcc-linker知道它在哪里寻找库.

并添加

> -lc
> -lstdc

到’final’编译命令让gcc编译器知道它应该找到哪些lib名称并搜索未解析的符号.

对不起,我无法在我的机器上测试这个.
如果遇到问题,我似乎记得使用相对路径名(而不是绝对路径)到库所在的目录.当我看,它似乎是我当时做的,但这可能是一些其他目标,使相对路径有用.

我也这样做了,你可能想要在你的make文件中添加一个目标,以确保你链接的.a或.so是最新的w.r.t你的代码中包含的头文件库#including.我的makefile只是调用了一个cp来将最新的lib放在my_lib64中.协调库和标题更新是我希望我的系统管理员在与我的目标合作时所做的事情之一.

最后……确保#include的头文件是正确的.要检查,请在编译中添加-H,并仔细阅读每个构建中为读取而触发的文件名和路径.

我想这样做会比较麻烦,但你可以使用类似的解决方法来处理sys-admin暴政并将最新的版本标题复制到你自己的目录中.但是现在你的工作比我想做的要困难一些.通常,当您安装较新版本的编译器时,它会附带相应的标头和库.

祝好运.

点赞