我的代码是用 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 复制到集群上的用户目录,以便我的程序动态链接到它们?如果是这样,我要设置哪个环境变量以便我的可执行文件可以动态链接到它们?
thanks.
你能复制这些文件吗?
是的。
对象库是像其他文件一样的普通文件。
当然,当系统管理员允许使用官方库时,您最终会想要连接它们。
对象库有两种形式....a(存档)和.so(共享对象)
如果将它们复制到同一个个人目录中,则 gcc 链接器将默认选择 .so 而不是 .a。
如果是这样,我设置哪个环境变量[原文如此]
我认为您不必担心标准 LIBRARY_PATH 或 PATH 条目,直到您需要交付,或者直到 lib64 变得“正式”可用。解开临时路径修改等是否比执行以下操作更困难?
将您想要的库复制到您自己的目录中,也许
/home/uname/my_lib64
变得
- .../my_lib64/libc.so.6
- .../my_lib64/libstdc++.so.6
Add
到你的“最终”编译命令,让 gcc 链接器知道它可以在哪里查找库。
并添加
到“最终”编译命令,让 gcc 编译器知道它应该找到什么库名称并搜索未解析的符号。
抱歉,我无法在我的机器上测试这个。
如果您遇到麻烦,我似乎记得使用库所在目录的相对路径名(而不是绝对路径)。当我看时,这似乎是我当时所做的,但这可能是其他一些目标使相对路径变得有用。
我也这样做了,您可能想在 make 文件中添加一个目标,以确保您链接到的 .a 或 .so 是您代码中 #include 的头库的最新内容。我的 makefile 只是调用了 cp 将最新的库放入 my_lib64 中。当我的系统管理员与我的目标合作时,协调库和标头更新是我希望他们做的事情之一。
最后...确保您#include 的头文件是正确的。要进行检查,请将 -H 添加到编译中,并仔细检查每个构建中触发读取的文件名和路径。
我想这样做会更混乱,但是您可以使用与 sys-admin 暴政类似的解决方法,并将最新版本标头复制到您自己的目录中。但现在你会比我想要的更努力一些。通常,当您安装较新版本的编译器时,它会附带相应的标头和库。
祝你好运。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)