我正在努力解决 Fedora 26 上的路径问题。我正在构建更新的程序和库并将它们放在/usr/local
.程序/usr/local/bin
使用 中的库/usr/local/lib
。由于目前未知的原因,gawk
位于 的Fedora 26/usr/bin/gawk
正在使用位于 的库/usr/local/lib
。
该库/usr/local/lib
与预期不兼容gawk
,因此它破坏了我的脚本。或者更正确地说,我的脚本调用 Autotools,然后即使路径没有混乱,Autotools 也会中断。有关背景问题的更多信息,请访问libreadline.so.7:未定义符号:UP在堆栈溢出上。
我想强制执行一项政策,其中的任何程序/usr/bin
都必须链接到/usr/lib
.我不关心混合或插入。如果我需要这样做,那么我将从源代码构建包并将其安装到/usr/local
.
其他操作系统很久以前就通过install_names
OS X 和 Windows 上的清单等解决了这个问题。 Linux 只是允许同样的问题恶化(我认为--enable-new-dtags
这是不能解决问题的最新创可贴)。
如何强制程序/usr/bin
链接到 中的库/usr/lib
?
答案1
您可以通过指定动态部分来覆盖可执行文件中的搜索路径 DT_RUNPATH
。看ld.so 手册页。使用标准位置应该是常态,并且应该通过为链接器添加以下 gcc 选项来链接要/usr/lib
使用库的(希望不是太多)程序:/usr/local/lib
gcc ... -Wl,-rpath,/usr/local/lib -Wl,--enable-new-tags ...
答案2
export LD_LIBRARY_PATH=/usr/lib
或者直接运行命令:
LD_LIBRARY_PATH=/usr/lib gawk
您可以在中配置默认搜索顺序/etc/ld.so.conf
答案3
当手动编译系统中已经存在的库时,无论它们去哪里,最新/usr/lib
的安装优先。库路径在 /etc/ld.so.conf 中指定,而 /etc/ld.so.conf 又读取.您可以在那里创建一个新文件,其中包含您想要的任何库的路径,然后在完成后运行。/usr/lib64
/usr/local/lib
/usr/local/lib64
/etc/ld.so.conf.d
ldconfig
或者,在脚本中,您可以使用LD_LIBRARY_PATH
环境变量设置自己的库路径。这将强制脚本采用其中指定的任何库路径。可以提供用分号分隔的多个路径。