Qt应用程序在从QtCreator启动时查找库,但不是从命令行启动
Qt app finds libraries when launched from QtCreator, but not from command line
我需要在项目目录中创建的文件夹("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>
您可以在路径内使用${}。
- 从命令行c++发送文本文件名
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 数组长度,为什么从命令行获取时不能使用它?
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 使用 C++ 将命令行参数拆分为参数/向量
- QProcess可以启动程序,但不能启动python(命令行)
- 如何创建一个可以在GUI对话模式下或通过命令行启动的C MFC程序
- Qt应用程序在从QtCreator启动时查找库,但不是从命令行启动
- 从命令行启动时,在for循环期间不显示C++cout语句
- 简单的HowTo在调试器中启动OSX上的C++命令行工具
- 启动主程序之前的访问命令行
- 我可以在启动程序时从命令行重定向其他文件描述符吗?
- 是否可以在不显示窗口的情况下启动命令行应用程序
- 从命令行 Python/C++ 启动 Minecraft