2017-09-06 195 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。或者查看系統上的其他服務腳本,以瞭解環境如何正確設置。

相關問題