如何解决可执行文件没有链接到我想要的动态库
我使用“https://www.mpich.org/static/downloads/3.4.1/mpich-3.4”中给出的步骤从源代码 (mpich-3.4.1.tar.gz) 构建并安装了 mpich .1-README.txt'。我希望生成的可执行文件动态链接到路径“/home/myname/mylibs”中指定的库。因此,在调用 ./configure 之前,我已将 LD_LIBRARY_PATH 设置为:
setenv LD_LIBRARY_PATH /home/myname/mylibs:$LD_LIBRARY_PATH
在目录“/home/myname/mylibs”内,我将“libc.so.6”和“libstdc++.so.6”软链接到我想要的库,因为我不希望生成的可执行文件链接到动态来自路径 /lib64/ 的库。我能够在我的机器上构建和安装 mpich。但是,当我对生成的其中一个可执行文件 (hydra_pmi_proxy) 调用“ldd”时,我看到以下内容:
$ ldd /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy
libc.so.6 => /lib64/libc.so.6 (0x00007f32f9eef000)
libstdc++.so.6 => /home/myname/mylibs/libstdc++.so.6 (0x00007f32f9542000)
rpath 似乎设置为我想要的路径“/home/myname/mylibs”,如下所示:
$ readelf -d /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy | egrep "RPATH|RUNPATH"
0x000000000000000f (RPATH) Library rpath: [/home/myname/mylibs]
如上所示,libstdc++.so.6 指向我想要的库,但 libc.so.6 仍然指向 /lib64/libc.so.6。我希望 libc.so.6 指向 /home/myname/mylibs/libc.so.6 有什么我可以做的事情吗?
我不希望我的 exe 动态链接到 /lib64/
中的库,因为当我在多台机器上启动我的 MPI 程序时,“hydra_pmi_proxy”似乎试图动态链接到 /lib64/libc.so.6
运行某个进程的机器。 (最有可能的是,它在新机器上生成一个子进程,该子进程又动态链接到该机器的 /lib64/libc.so.6)。我已经看到,当其中一个 mpi 进程尝试在 /lib64/libc.so.6 指向旧版本的任何机器上运行时,我收到错误消息。错误是:
/home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by /home/myname/mpich-3.4.1_install/bin/hydra_pmi_proxy)
。
当我登录到这台失败的机器并执行 strings /lib64/libc.so.6 | grep GLIBC_2
时,我没有看到 GLIBC_2.17 列出。然而,在 mpi 进程成功运行的所有其他机器上,我看到 GLIBC_2.17 列在运行“字符串”上。因此,我的目的是让所有可执行文件动态链接到仅位于“/home/myname/mylibs/”的库。这是正确的方法吗?
解决方法
我不希望生成的可执行文件从路径 /lib64/ 链接到动态库
libc.so.6
是一个特例。请参阅 this answer 了解原因。
如果您真的想将您的二进制文件与 /lib64/...
中的库隔离,您必须:
- 配置构建并安装到
/home/myname/mylibs/
新版本的 GLIBC(符号链接是不够的)和 - 将您的
--dynamic-linker
和--rpath
设置为指向mylibs
。
也就是说,您没有解释为什么您不想链接来自 /lib64
的库。 http://xyproblem.info 可能与此处相关。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。