國產化替代是將來各單位的主流趨勢,探索自行開發應用程序在國產操作系統上正常運行是將來的主要工作之一。本文淺嘗gui程序在統信社區版——deepin上遇到的小問題。
使用Qt在deepin上做了一個類似gif的幀動畫彈窗,在編譯運行時,程序可以正常運行,但是會報錯顯示:
qt.qpa.plugin: Could not find the Qt platform plugin "dxcb" in ""
在網上查,有說需要在/etc/profile中添加環境變量
export QT_QPA_PLATFORM_PLUGIN_PATH=/path/to/Qt/plugins/platforms
試了,還是報錯,但程序能運行。
直接在終端運行編譯后的可執行文件,又報如下錯誤:
/home/shell811127/workspace/qt/build-test-unknown-Debug/test: error while loading shared libraries: libicui18n.so.63: cannot open shared object file: No such file or directory
使用ldd查看程序依賴的鏈接庫,發現有3個依賴找不到,其中包括上面報錯的庫名
ldd /home/shell811127/workspace/qt/build-test-unknown-Debug/test
linux-vdso.so.1 (0x00007ffe3cfa9000)libQt5Widgets.so.5 => /opt/deepin-shared-libs/Qt5.15.10gles/lib/libQt5Widgets.so.5 (0x00007f7511e00000)libQt5Gui.so.5 => /opt/deepin-shared-libs/Qt5.15.10gles/lib/libQt5Gui.so.5 (0x00007f7511600000)libQt5Core.so.5 => /opt/deepin-shared-libs/Qt5.15.10gles/lib/libQt5Core.so.5 (0x00007f7511000000)libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7510c00000)libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f751258f000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7511c1c000)libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7512588000)libGLESv2.so.2 => /lib/x86_64-linux-gnu/libGLESv2.so.2 (0x00007f7512576000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7512497000)libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f75115ca000)libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7512478000)libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f7510eda000)libicui18n.so.63 => not foundlibicuuc.so.63 => not foundlibicudata.so.63 => not foundlibdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7512471000)libpcre2-16.so.0 => /lib/x86_64-linux-gnu/libpcre2-16.so.0 (0x00007f7510b78000)libgthread-2.0.so.0 => /lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f751246a000)libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f7510a2c000)
直接使用find / -name libicui18n.so.63 查找三個缺失的文件,發現系統中存在,不過都在Qt的安裝目錄下:/opt/deepin-shared-libs/Qt5.15.10gles/lib/
嘗試在系統目錄下建立軟連接:
sudo ln -s /opt/deepin-shared-libs/Qt5.15.10gles/lib/libicui18n.so.63 /usr/lib/x86_64-linux-gnu/libicui18n.so.63
再在終端執行編譯后的執行文件,發現缺失的庫文件名變了,說明之前的庫文件系統找到了。于是嘗試把剛才ldd查找的缺失庫文件全部在/usr/lib/x86_64-linux-gnu/下建立軟連接,程序可正常執行了。
總結,在Qt中編譯運行時,程序會默認到Qt的lib目錄下尋找依賴,但在操作系統中運行可執行文件,系統默認會在/usr/lib/x86_64-linux-gnu/目錄下查找依賴,所以要想正常運行開發的程序,需要手動將程序依賴拷貝到系統目錄下,程序方可正常運行。這有點像在windows下安裝程序,需要將dll文件拷貝到system32下,只不過這里的目錄是/usr/lib/x86_64-linux-gnu/。