我创建了一个简单的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
答案 0 :(得分:1)
很可能链接器目录在systemctl
的上下文中是未知的。尝试在服务脚本开头将环境变量LD_LIBRARY_PATH
设置为相关目录;有关详细信息,请参阅man ld.so
。或者查看系统上的其他服务脚本,以了解如何在那里正确设置环境。