2017-09-06 58 views
1

我创建了一个简单的Qt控制台应用程序(dbus服务),我需要使用systemd启动它。当从systemd启动Qt应用程序时无法加载库

不过我每次执行时间systemctl启动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. 

从另一方面应用程序启动罚款我做到这一点从控制台时,在根用户(即它无法注册在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 
+1

init.d和我虽然systemd不知道用户/本地库和路径。例如,启动时的init.d知道/ bin,/ sbin/lib文件夹,但不知道/不会知道/ usr/bin/usr/local/bin/usr/local/lib等。 – Xplatforms

+0

您可以尝试要将Qt库链接到/ lib文件夹中,或者最好先尝试/ usr/lib文件夹。您也可以尝试在启动服务之前设置LD_LIBRARY_PATH,或者设置此值并在bash脚本中启动二进制文件 – Xplatforms

回答

1

最有可能链接器的目录并不在上下文已知systemctl。尝试在服务脚本开始时将环境变量LD_LIBRARY_PATH设置为相关目录;详情请参阅man ld.so。或者查看系统上的其他服务脚本,以了解环境如何正确设置。

相关问题