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

时间:2015-12-08 12:24:39

标签: linux qt qt5 dynamic-linking dynamic-library

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

到目前为止,一切正常,直到我调用可执行脚本:应用程序无法运行。当我要求运行sudo时,它告诉我库(Qt5SerialPort ...)丢失了。对实际可执行文件运行ldd我发现该应用程序不是从lib文件夹中获取所需的库,而是一些明显的硬编码路径。

我尝试使用qt.conf来解决这个问题,但没有成功。注意here,似乎qt.conf实际上不应该以这种方式工作。咨询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。

我错过了什么?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

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

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

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

详情see