Qt应用程序在从QtCreator启动时查找库,但不是从命令行启动

Qt app finds libraries when launched from QtCreator, but not from command line

本文关键字:启动 命令行 应用程序 QtCreator Qt 查找      更新时间:2023-10-16

我需要在项目目录中创建的文件夹("shared")中提供一个带有共享库(Ubuntu)的产品,即/usr/lib/usr/local/lib等中而非的共享库。为此,我在.pro文件中完成了这项工作,即

LIBS += -Lshared/gsl -lgsl -lgsl_cblas

注意,可执行文件位于"共享"文件夹的同一目录中。当我从QtCreator以调试模式启动程序时,一切都正常。此外,如果我删除或重命名"shared"中的库,程序将无法启动,而且我已经验证了应用程序在其他地方找不到这些库。但当我从命令行启动时,我会得到

加载共享库时出错:libgslcblas.so.0:无法打开共享对象文件:没有这样的文件或目录

怎么回事?

编辑:该解决方案是以下lionbest的变体,如评论中所述。出于某种原因,事实证明,在我的平台上,qmake/QMAKE_FLAGS只允许链接器选项使用特定的格式,而不允许在谷歌上搜索其他使用过QMAKE_FLAGS的实例。即

QMAKE_FLAGS += "-Wl,-rpath,'$$ORIGIN/shared/gsl'"
QMAKE_LFLAGS_RPATH=

具体来说,问题是解析器(或链接器)不会接受-rpath=...,尽管这似乎适用于其他所有人。Ubuntu 12.04,gcc 4.6.3,Qt 4.8.0,QtCreator 2.4.1"基于Qt 4.7.4"。希望这次经历能为其他人省去同样的挫折。

使用环境变量LD_LIBRARY_PATH=shared/gsl启动程序或将RPATH添加到链接器设置:

LIBS += -Wl,-rpath=shared/gsl

如果您想为您的应用程序创建快捷方式,大多数发行版(基于Gnome、KDE、LXDE和XFCE)都使用.desktop文件。QtCreator可能为您生成了一个。您需要编辑或生成它,并在安装过程中将其放入$HOME/.local/applications或/usr/share/applications/。在桌面文件中,您可以添加environmetal变量和启动目录如下:

Exec=/usr/bin/env LD_LIBRARY_PATH=/<path_to_libs>/ /<path>/app -extra_options

如果您需要在特定目录中运行应用程序,请添加行:

Path=/<path_to_your_application_working_dir>

您可以在路径内使用${}。