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

时间:2014-01-10 23:54:37

标签: c++ gcc c++11 g++

我的代码是用c ++ 2011编写的,用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复制到群集上的用户目录中,以便我的程序动态链接到它们?如果是这样,我设置了哪个环境变量,以便我的可执行文件可以动态链接到它们?

感谢。

4 个答案:

答案 0 :(得分:2)

  

你能复制这些文件吗?

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

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

  

如果是,我设置了哪个环境变量[原文如此]

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

将您想要的库复制到您自己的目录中,也许

      /home/uname/my_lib64

成为

  • ... / my_lib64 / libc.so.6
  • ... / my_lib64 /的libstdc ++。so.6

添加

  • -L /家/ 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暴政并将最新版本的标头复制到您自己的目录中。但是现在你的工作比我想做的要困难一些。通常,当您安装较新版本的编译器时,它会附带相应的标头和库。

祝你好运。

答案 1 :(得分:0)

这取决于你的“群集”允许的内容。如果您可以访问这些计算机上的主目录,则可以使用环境LD_LIBRARY_PATH找到相关的库。

答案 2 :(得分:0)

查看man ld.so以获取完整详情。 LD_LIBRARY_PATH的工作方式与$PATH非常相似,但适用于图书馆。复制旧库后,LD_LIBRARY_PATH=/home/user/libraries:/home/user/math_libs:$LD_LIBRARY_PATH可能就是您所需要的。

但是你可能需要所有旧的库,因为新的库将使用较新的libc / c ++问题是较旧的libc也意味着使用不同的Linux内核。因此,由于系统调用不匹配,可能会得到奇怪的结果。

答案 3 :(得分:0)

使用Redhat勘误表并阅读最新库的注意兼容性和要求。这是您需要遵循的大量支票清单。 没有简短回答是正确的。

作为示例,我刚刚将Redhat 6.6和6.3 / 6.2 / 6.1的几个不同服务器升级到编译器g ++ 4.4.7所需的相同版本的glibc和stdc ++库。

您可以选择对Redhat所需的系统级别进行部署。对于Redhat 5使用较新的4.8编译器库.. - 我强烈建议从经验 - 忘记它!