如何让应用程序使用本地共享库而不是系统共享库

如何让应用程序使用本地共享库而不是系统共享库

我使用 qt online 安装程序安装了 qtcreator。它附带了自己版本的 qt 库。qt 库也安装在系统目录中,但那些比较旧。我在使用 qtcreator 时遇到了问题(请参阅qt 论坛)。我怀疑这可能是因为 Qt 使用的是旧系统库,因此我使用

strace -e open qtcreator.sh

事实上,它使用了 /usr/lib/x86_64-linux-gnu/qtcreator/ 中的库

为了加载正确的库,qrcreator.sh 脚本将 LD_LIBRARY_PATH 设置为

/home/<me>/Qt/Tools/QtCreator/lib:/home/<me>/Qt/Tools/QtCreator/lib/qtcreator

这是正确的,但是仍然使用 /usr/lib/x86_64-linux-gnu/qtcreator 中的库。

尽管存在系统范围的库,我怎样才能告诉 qtcreator 使用本地库?

答案1

对于 Nathan 的选项,我想添加patchelf允许更改RPATH可执行文件的选项。我个人更喜欢修补而不是RPATH定义之LD_LIBRARY_PATH类的东西,因为 Ubuntu 在定义这些方面存在问题,profile并且如果未在中定义这些profile,则无需使用包装器脚本。

要定义相对于应用程序目录的可执行文件RPATH(如果你愿意,这不是必须的),你必须使用$ORIGIN 小心避开$必须按字面意思出现(因此如果您从 shell\$ORIGIN调用,请使用)。例如,如果应用程序属于某个目录,而库属于对等目录,则您将使用。patchelfbinlib$ORIGIN/../libRPATH

RPATH如果愿意的话,您也可以使用绝对值。

Patchelf(nixos.org)

答案2

可以使用“LD_PRELOAD”环境变量预加载库。只需指定 so 文件的完整路径,如下所示:

export LD_PRELOAD = "/path/to/so1.so /path/to/so2.so"

相关内容