- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
编辑:我解决了这个问题,解决方案如下。
我正在专用于科学计算的共享计算集群中构建代码,因此我只能控制我的主文件夹中的文件。虽然我以 fftw 为例,但我想了解具体原因,为什么我尝试设置 LD_LIBRARY_PATH 不起作用。
我像这样在我的主文件夹中构建 fftw 和 fftw_mpi 库
./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared
make install
构建良好,但在 install/fftw/lib 中,我发现新构建的 libfftw3_mpi.so 链接到错误版本的 fftw 库。
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000)
如果我现在尝试将 LD_LIBRARY_PATH 设置为正确指向该目录,它仍然会选择错误的库:
$ export LD_LIBRARY_PATH=$HOME/install/fftw/lib
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f32b4794000)
只有当我显式使用 LD_PRELOAD 时,我才能覆盖此行为。不过,我认为 LD_PRELOAD 不是合适的解决方案。
$ export LD_PRELOAD=$HOME/install/fftw/lib/libfftw3.so.3
$ ldd libfftw3_mpi.so |grep fftw
$HOME/install/fftw/lib/libfftw3.so.3 (0x00007f5ca3d14000)
这是我所期望的,在 Ubuntu 桌面上进行的一个小测试,我首先将 fftw 安装到/usr/lib,然后用 LD_LIBRARY_PATH 覆盖此搜索路径。
$ export LD_LIBRARY_PATH=
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => /usr/lib/x86_64-linux-gnu/libfftw3.so.3
$ export LD_LIBRARY_PATH=$HOME/install/fftw-3.3.4/lib
$ ldd q0test_mpi |grep fftw3
libfftw3.so.3 => $HOME/install/fftw-3.3.4/lib/libfftw3.so.3
简而言之:为什么 libfft3_mpi 库仍然找到错误的动态 fftw3 库?这个搜索路径在哪里以优先于 LD_LIBARY_PATH 的方式硬编码?为什么在另一台计算机上不是这种情况?
如果这很重要,我正在使用英特尔编译器 13.1.2、mkl 11.0.4.183 和 openmpi 1.6.2。
编辑:感谢您的所有回答。在这些帮助下,我们能够将问题隔离到 RPATH,并且从那里,集群支持能够找出问题。我接受了第一个答案,但两个答案都很好。
之所以如此难以弄清楚,是因为我们不知道编译器实际上是包装脚本,向编译器命令行添加东西。以下是支持人员回复的一部分:
[The] compilation goes through our compiler wrapper. We do RPATH-ing by default as it helps most users in correctly running their jobs without loading LD-LIBRARY_PATH etc. However we exclude certain library paths from default RPATH which includes /lib, /lib64 /proj /home etc. Earlier the /usr/lib64 was not excluded by mistake (mostly). Now we have added that path in the exclusion list.
最佳答案
来自 http://man7.org/linux/man-pages/man8/ld.so.8.html
When resolving shared object dependencies, the dynamic linker first inspects each dependency string to see if it contains a slash (this can occur if a shared object pathname containing slashes was specified at link time). If a slash is found, then the dependency string is interpreted as a (relative or absolute) pathname, and the shared object is loaded using that pathname.
If a shared object dependency does not contain a slash, then it is searched for in the following order:
o (ELF only) Using the directories specified in the DT_RPATH dynamic section attribute of the binary if present and DT_RUNPATH attribute does not exist. Use of DT_RPATH is deprecated.
o Using the environment variable LD_LIBRARY_PATH. Except if the executable is a set-user-ID/set-group-ID binary, in which case it is ignored.
o (ELF only) Using the directories specified in the DT_RUNPATH dynamic section attribute of the binary if present.
o From the cache file /etc/ld.so.cache, which contains a compiled list of candidate shared objects previously found in the augmented library path. If, however, the binary was linked with the -z nodeflib linker option, shared objects in the default paths are skipped. Shared objects installed in hardware capability directories (see below) are preferred to other shared objects.
o In the default path /lib, and then /usr/lib. (On some 64-bit archiectures, the default paths for 64-bit shared objects are /lib64, and then /usr/lib64.) If the binary was linked with the -z nodeflib linker option, this step is skipped.
与 readelf readelf -d libfftw3_mpi.so
您可以检查您的库是否在动态部分包含这样的属性。
与 export LD_DEBUG=libs
您可以调试用于查找库的搜索路径
与 chrpath -r<new_path> <executable>
rpath可以改变
关于linux - 为什么我不能用 LD_LIBRARY_PATH 覆盖动态库的搜索路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33519640/
在编译和链接C和C++代码时,LTDL_LIBRARY_PATH和LD_LIBRARY_PATH环境变量的作用是什么?另外它们还有什么区别? 谢谢 最佳答案 LTDL_LIBRARY_PATH 为 l
我是 Linux 的新手,刚刚使用带有 ARM64(Aarch64)的 Ubuntu 20.04 在 Oracle 云中设置了一个 VM。 我安装的 python 模块只有在我每次打开终端时都使用以下
我可以为单个应用程序设置 LD_LIBRARY_PATH 吗? 我正在调查系统调用失败,那么有什么方法可以使用 LD_LIBRARY_PATH 设置来设置正确的路径吗? 最佳答案 最简单的方法是创建一
我是 ubuntu 和 python 的新手。当我运行命令 LD_LIBRARY_PATH 时,功能运行良好。 ***sudo LD_LIBRARY_PATH=/binaries/linux/x86_
在 Ubuntu 上运行 GDB 7.4-2012.02 并且遇到我无法在其他平台上复制的奇怪行为。 bash$ export LD_LIBRARY_PATH=my_path bash$ export
构建 snap 包时,包装器脚本会自动将 $SNAP/usr/lib 添加到 LD_LIBRARY_PATH。 在 docker 上构建我的包时,一些库(在本例中为 liblapack 和 libbl
我想将这些文件编译成可执行文件。 //main.c #include #include int main(void){ call_hello_world(); return 0; } //
是否可以更改当前进程的环境变量? 更具体地说,在 python 脚本中,我想更改 LD_LIBRARY_PATH,以便在导入依赖于某些 xyz.so 的模块“x”时,xyz .so 取 self 在
我读了this article recently ,为了好玩,我尝试通过执行以下操作来覆盖 libc printf 函数:- 创建一个使用 printf 打印的可执行文件 这是一个测试(printer
我在centos 6.4上安装了两个版本的python。它带有 python 2.6.6。我在/home/python 中安装了 2.6.2。我的 PATH 变量在路径(/usr/bin/python
我正在修改一个现有脚本,我想在其中检查可执行文件中使用的一组库以及在运行时调用的共享库。我有需要与共享库进行比较的库列表。为了获取共享库,我试图通过提供以下代码来获取 LD_LIBRARY_PATH,
当 git 给出以下错误信息时,问题就开始了“致命:无法找到‘https’的远程助手” 为了解决这个问题,我必须先编译 libcurl 来重新编译 git。在编译 git 时,我设置了 CPPFLAG
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是 on-topic用于堆栈溢出。 已关闭10 年前。 Improve t
我想使用 lib.so 运行 C++ 代码并设置“LD_LIBRARY_PATH=/apollo/bazel-bin”,但 lib.so 位于“/apollo/bazel-bin/python”中,然
我正在尝试编译一个使用 zlib 的演示,我想我已经为 LD_LIBRARY_PATH 做了正确的设置,但它不适用于 -lz 标志,你能帮我找出问题所在吗? lisanhu@lisanhu-XPS-1
我有一个打印环境变量的简单控制台应用程序: int main(int argc, char **argv, char **envp) { printf("Scanning for LD_LIB_P
我正在尝试编译一个程序,但在配置检查期间找不到一个库。将我的 .bashrc 文件链接到这个库: LD_LIBRARY_PATH=/usr/lib/:/users/much/needed/libra
我正在为我的应用开发一个简单的插件架构。插件是具有已知“获取接口(interface)”功能的共享对象。我通过 dlopen/dlsym 等访问 .so。相当标准。我的一些插件有额外的 .so 文件也
我写了一个共享对象,比如说libsd.so,我把libsd.so和它的头文件sd.h放在~/lib. 这是另一个使用libsd.so的程序,比如test.c,然后像这样编译它: $ gcc -o te
我正在尝试在无法设置环境变量(无法导出)的远程系统上运行程序。我遇到的问题是我无法设置 LD_LIBRARY_PATH 来运行我的二进制文件,因为我没有(也无法获得)许可。 我需要对此进行快速修复,以
我是一名优秀的程序员,十分优秀!