从 systemd 启动 Qt 应用程序时无法加载库

Cannot load libraries when Qt application is launched from systemd

我已经创建了一个简单的 Qt 控制台应用程序(dbus 服务),我需要使用 systemd 启动它。

但是每次我执行 systemctl start my_serv 它都无法启动应用程序,我最终登录 journalctl -xe 表示应用程序未能加载 libQt5Gui.so.5(我很确定它与这个特定的库无关):

raspberrypi systemd[1]: Started my_serv.service.
raspberrypi MyService[2812]: /opt/services/MyService: error while loading shared libraries: libQt5Gui.so.5: cannot open shared object file: No such file or directory
raspberrypi systemd[1]: my_serv.service: main process exited, code=exited, status=127/n/a
raspberrypi systemd[1]: Unit my_serv.service entered failed state.

另一方面,当我在 root 用户下从控制台执行此操作时,应用程序启动正常(即它无法在 dbus 上注册对象,但我认为它不相关):

./MyService
WELCOME FROM MY SERVICE
Object was registered on dbus
Service was not registered on dbus

Qt 库位于以下路径:

ls -al /usr/local/qt5/lib/libQt5Gui.*
-rwxrwxrwx /usr/local/qt5/lib/libQt5Gui.la
-rwxrwxrwx /usr/local/qt5/lib/libQt5Gui.prl
lrwxrwxrwx /usr/local/qt5/lib/libQt5Gui.so -> libQt5Gui.so.5.9.1
lrwxrwxrwx /usr/local/qt5/lib/libQt5Gui.so.5 -> libQt5Gui.so.5.9.1
lrwxrwxrwx /usr/local/qt5/lib/libQt5Gui.so.5.9 -> libQt5Gui.so.5.9.1
-rwxrwxrwx /usr/local/qt5/lib/libQt5Gui.so.5.9.1

二进制文件中的库链接似乎一切正常。 ldd输出如下:

ldd MyService
libQt5Gui.so.5 => /usr/local/qt5/lib/libQt5Gui.so.5 (0x76a92000)
libQt5DBus.so.5 => /usr/local/qt5/lib/libQt5DBus.so.5 (0x76a0d000)
libQt5Core.so.5 => /usr/local/qt5/lib/libQt5Core.so.5 (0x7654e000)

服务文件如下所示 (/etc/systemd/system/my_serv.service)

[Service]
ExecStart=/opt/services/MyService
User=root

很可能链接器目录在 systemctl 的上下文中是未知的。尝试在服务脚本开始时将环境变量 LD_LIBRARY_PATH 设置为相关目录;有关详细信息,请参阅 man ld.so。或者查看您系统上的其他服务脚本,了解如何正确设置那里的环境。