LD_LIBRARY_PATH 尝试 运行 Qt 应用时失败

LD_LIBRARY_PATH failing while trying to run Qt app

我想 运行 基于 Qt 5 的应用程序使用 Linux 上的动态库。总而言之,脚本会将可执行文件和其他相关文件(包括 lib 文件夹中所有必需的 .so)复制到所需的目的地,并且调用 gksudo 的脚本将作为应用程序的调用方工作。

到目前为止一切正常,直到我调用可执行脚本:应用程序没有 运行。当我用 sudo 询问 运行 时,它告诉我缺少一个库 (Qt5SerialPort...)。 运行 ldd 在实际的可执行文件上,我发现该应用程序不是从 lib 文件夹中获取所需的库,而是从一些明显的硬编码路径中获取。

我尝试使用 qt.conf 来解决这个问题,但没有成功。正如注释 here, it would seem qt.conf isn't actually supposed to work this way. Consulting the Qt documentation,我决定使用 LD_LIBRARY_PATH 告诉链接器在哪里可以找到库,因为无论如何我已经在使用脚本来 运行 应用程序。所以最终总结的脚本代码是

#!/bin/sh
LD_LIBRARY_PATH=lib/
export LD_LIBRARY_PATH
sudo ldconfig #sometimes  sudo /sbin/ldconfig -v
gksudo "$INSPATH/myApp" #or sudo instead

问题是它仍然无法正常工作。当我调用 echo $LD_LIBRARY_PATH 时,我可以看到变量已被正确编辑,但是当我调用 运行 行(使用 sudo)时,它一直告诉我找不到 lib。

我错过了什么?

sudo 没有通过 LD_LIBRARY_PATH:

$ LD_LIBRARY_PATH=lib/
$ export LD_LIBRARY_PATH
$ env | grep LD_LIBRARY_PATH
LD_LIBRARY_PATH=lib/
$ sudo env | grep LD_LIBRARY_PATH

您可以将其设置为命令 运行 作为 root:

$ sudo env LD_LIBRARY_PATH=/lib env | grep LD_LIBRARY_PATH
SUDO_COMMAND=/usr/bin/env LD_LIBRARY_PATH=/lib env
LD_LIBRARY_PATH=/lib

你会想要像

这样的东西
sudo env LD_LIBRARY_PATH=/lib "$INSPATH/myApp"

一如既往,小心sudo

这是一个真正的 Linux 问题。最好的解决方案是在可执行文件中显式设置库位置,但这并不那么简单。

Linux 应用程序可以在创建所谓的桌面文件时启动。所有主要软件公司,如 Google,都通过安装脚本在用户桌面或菜单中创建其产品的桌面文件。问题是桌面文件需要应用程序的硬编码位置。这意味着在安装过程中必须在桌面文件中查询和设置此位置。另外桌面文件是文本文件,不能设置LD_LIBRARY_PATH

有一个解决方法。它没有赢得选美比赛,但它有效。人们总是可以通过脚本启动应用程序,并且此脚本可以在 运行 应用程序之前设置 LD_LIBRAREY_PATH。但是用户可能不喜欢 running/clicking "application.sh" 脚本。他们希望通过双击应用程序文件来 运行 它。我们通过以下方式解决这个问题:执行脚本时我们知道应用程序的文件位置。所以我们让脚本先生成桌面文件,然后再执行应用程序。桌面文件执行脚本。但是因为您可以设置桌面文件的名称和图标,所以这对用户来说是透明的。

最终结果是用户必须点击一次shell脚本,然后才能点击真正的应用程序快捷方式文件。

详情see