我想在Linux上运行基于Qt 5的应用程序usind动态库.总之,脚本会将可执行文件和其他相关文件(包括lib
文件夹中所有必需的.so)复制到所需目标,并且脚本调用gksudo
将作为应用程序的调用者.
直到我调用可执行脚本直到现在一切正常:应用程序无法运行.当我要求运行时sudo
,它告诉我库(Qt5SerialPort ...)丢失了.运行ldd
实际的可执行文件我发现应用程序正在从lib
文件夹中获取所需的库,但是一些明显的硬编码路径.
我尝试通过使用解决这个问题,qt.conf
但没有成功.在这里注意,似乎qt.conf
实际上并不应该以这种方式工作.咨询Qt文档,我决定用LD_LIBRARY_PATH
链接器告诉链接器在哪里找到libs,因为我已经使用脚本来运行应用程序了.所以最终的,总结的脚本代码是
#!/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
!