尝试运行Qt应用程序时,LD_LIBRARY_PATH失败



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

直到现在一切都很好,直到我调用可执行脚本:应用程序不运行。当我要求使用sudo运行时,它会"告诉"我缺少库(Qt5SerialPort…)。在实际的可执行文件上运行ldd,我发现应用程序不是从lib文件夹中获得所需的库,而是从一些明显的硬编码路径中获得的。

我试图用qt.conf解决这个问题,但没有成功。正如这里所注意到的,qt.conf实际上似乎不应该以这种方式工作。参考Qt文档,我决定使用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应用程序可以在创建所谓的桌面文件时启动。所有主要的软件公司,如谷歌,都会通过安装脚本在用户的桌面或菜单中创建其产品的桌面文件。问题是桌面文件需要应用程序的硬编码位置。这意味着在安装过程中,必须在桌面文件中询问并设置此位置。此外,桌面文件是无法设置LD_LIBRARY_PATH的文本文件。

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

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

有关详细信息,请参阅。

相关内容

  • 没有找到相关文章

最新更新