我正在尝试启动一个依赖于我的路径中的某些库的程序,但是该程序表示找不到这些文件:
11:45:27 ~ > echo $PATH
/usr/share/fsl/5.0/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/mri/Scripts:/home/mri/Scripts/MRI:/home/mri/Software/BRAINS3/bin:/home/mri/Software/BRAINS3/lib:/home/mri/Software/ITK_Build/bin:/home/mri/Software/ITK_Build/lib:/home/mri/Software/VTK_Build/bin:/home/mri/Software/VTK_Build/lib:/usr/lib/fsl/5.0
11:45:33 ~ > brains3
/home/mri/Software/BRAINS3/bin/brains3_real: error while loading shared libraries: libiplUtils.so: cannot open shared object file: No such file or directory
11:45:35 ~ > sudo find / -name libiplUtils.so
[sudo] password for mri:
/home/mri/Software/BRAINS3/lib/libiplUtils.so
有人知道如何解决这个问题吗?
答案1
您可以使用环境变量指定库搜索路径LD_LIBRARY_PATH
。
$ export LD_LIBRARY_PATH=/home/mri/Software/BRAINS3/lib
$ brains3
您不应该为整个系统设置此变量。如果您不能/不想在系统范围内安装软件,您可以创建一个包装脚本。
答案2
动态链接器在 LD_LIBRARY_PATH 中搜索库。
答案3
Unix 系统倾向于将不同类型的文件分类到不同的目录中。可执行文件(例如/usr/bin
)、文档(例如/usr/man
、/usr/info
、...)、本机库(例如/usr/lib
)、Perl 库(例如/usr/lib/perl5
)等都有单独的目录。相应地,有不同的路径变量,都具有相同的语法(以冒号分隔的目录列表):PATH
用于可执行文件、MANPATH
用于手册页、LD_LIBRARY_PATH
用于本机库1、PERL5LIB
用于 Perl 库等。
对于本机库,无论环境变量中是否提及,搜索路径中都有系统默认库LD_LIBRARY_PATH
。在 Linux 上,这些目录列在/etc/ld.so.conf
(并且/lib
始终/usr/lib
在搜索路径中)。
因此,您有几种可能性:
- 添加
/home/mri/Software/BRAINS3/lib
到/etc/ld.so.conf
(Linux 特定的,其他 UNIX 变体可能有类似的文件)。运行ldconfig
以使更改生效。 - 添加(适用于所有用户)或添加
export LD_LIBRARY_PATH=/home/mri/Software/BRAINS3/lib
(仅适用于您)。/etc/profile
~/.profile
制作一个包装脚本:
#!/bin/sh export LD_LIBRARY_PATH=/home/mri/Software/BRAINS3/lib exec /home/mri/Software/BRAINS3/bin/brains3 "$@"
/home/mri/Software/BRAINS3/lib
创建指向搜索路径上另一个目录中的库的符号链接:ln -s /home/mri/Software/BRAINS3/bin/brains3/lib*.so.* /usr/local/lib/
¹是大多数 Unix 变体上的名称,但 Mac OS X 使用的是。 LD_LIBRARY_PATH
DYLD_LIBRARY_PATH