【发布时间】:2018-02-14 18:21:10
【问题描述】:
我创建了一个简单的 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
【问题讨论】:
-
init.d 和我虽然 systemd 不知道用户/本地库和路径。例如 init.d 在启动时知道 /bin、/sbin /lib 文件夹但不知道也不会知道 /usr/bin /usr/local/bin /usr/local/lib 等。
-
您可以尝试将 Qt 库链接到 /lib 文件夹,或者最好先尝试 /usr/lib 文件夹。您还可以尝试在启动服务之前设置 LD_LIBRARY_PATH 或包装设置此值并在 bash 脚本中启动二进制文件
标签: qt service raspberry-pi shared-libraries systemd