Ubuntu下Qt程式的打包發佈

2020-08-10 16:44:59

Ubuntu18.04
qt:5.14.0
爲便於描述,我們這裏假設生成的程式名稱爲test(即要發佈的程式名稱)

方法一:

1. QtCreate使用Release版本編譯

將編譯後生成的可執行程式(如:test)複製到一個空目錄下

2.使用ldd命令檢視和導出需要的庫

在步驟1的目錄下新建一個pack.sh檔案,檔案內容如下:

#!/bin/sh  
exe="test" #你需要發佈的程式名稱
des="/home/someone/QtProject/build-test-Desktop-Release/Test" #步驟1中的目錄即本檔案所在目錄
deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
cp $deplist $des

檔案中有兩處中文註釋的地方需要修

3.編寫執行程式的sh檔案

在此目錄下再新建一個test.sh檔案(檔名必須與可執行檔案名字一樣),
檔案內容如下(不需要修改):

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"

4.執行程式

賦予test.sh執行許可權,
chmod +x test.sh

執行程式
./test.sh
將此目錄打包發佈即可,注意需要執行程式時是執行test.sh檔案,不是release生成的可執行程式

我自己測試用的是Debug版本是可以的,Release不可以,臨時寫的,不太懂,僅是爲了專案測試需要,趕鴨子上架寫的。。。。

方法二:

沒試過

打包發佈Linux 版Qt應用
1、把編譯的應用 主程式(例如 myqtapp) 複製 到 另一簡單起名的資料夾,例如 主目錄下 ~/myapp
(把應用所需的SQLite等數據庫也一同放入,或者放入程式程式碼指定的位置,例如 /var/opt內的位置,程式使用的普通圖片,按程式碼指定也放入指定位置或 ~/myapp內,例如,我的是放在 ~/myapp/images)

2、程式需要用到的各個外掛也從Qt安裝目錄中複製到主程式目錄內
(例如在 /opt/Qt5.8.0/5.8/gcc_64/plugins ,我用到 platforms 、 sqldrivers 和 imageformats,其中 platforms我只用到 libqxcb.so,則platforms夾內需libqxcb.so一個檔案即可,sqldrivers是SQLite,Mysql驅動,imageformats是圖片呼叫需要)

3、複製必須的 庫檔案 ,先建立 指令碼(cplib.sh),
vi ~/myapp/cplib.sh
內容是:

#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done

終端下執行命令:

cd ~/myapp
chmod +x cplib.sh
./cplib.sh myqtapp

完成後,可以見到在 ~/myapp目錄內生成lib目錄,內有主程式需用到的多個庫檔案,從中取出必要的部分,不需要全部檔案
建立 ~qtlib資料夾,從 ~/myapp/lib 內複製以下必需庫檔案:
libicudata.so.56、libicui18n.so.56、libicuuc.so.56、libQt5Core.so.5、libQt5DBus.so.5、libQt5Gui.so.5、libQt5Network.so.5、libQt5PrintSupport.so.5、libQt5SerialPort.so.5、libQt5Sql.so.5、libQt5Widgets.so.5件和檔名中包含xcb的全部檔案,例如 libX11-xcb.so.1、libxcb.so.1等
(libQt5Network.so.5、libQt5PrintSupport.so.5、libQt5SerialPort.so.5、libQt5Sql.so.5這些是我的主程式使用,自動找到,如沒有對應功能,則沒有對應檔案)

4.複製 libqxcb.so 需要的庫檔案
先把 cplib.sh 複製 一份 ,放入 ~/myapp/platforms,然後
cd ~/myapp/platforms
./cplib.sh libqxcb.so
完成後, ~/myapp/platforms目錄內生成lib目錄,內有libqxcb.so需用到的多個庫檔案,從中取出必要的部分,不需要全部檔案,也是複製 到 ~qtlib資料夾
libQt5DBus.so.5、libQt5XcbQpa.so.5、和檔名中包含xcb的全部檔案。

5.目標機器安裝 qtlib
把 qtlib 資料夾內容 放入 /usr/local/lib/qtlib
sudo許可權 在/etc/ld.so.conf.d 下增加檔案 usr-libs.conf
內容 是
/usr/local/lib/qtlib
然後 執行 sudo ldconfig

6.最後檢查是否缺少 其他庫檔案,在終端下 執行 主程式
如沒有 正常執行,會有出錯資訊提示,檢視其中 的 庫檔名 libXXXX.so.XX,在Qt的安裝目錄 中找檔案
例如在:/opt/Qt5.8.0/5.8/gcc_64/lib
要注意的是區分所複製出來的檔案不能是鏈接檔案同,要找到真正的庫檔案,複製 到 /usr/local/lib/qtlib ,並重新命名這庫檔案 在出錯資訊中顯示的正確的檔名
重新執行 sudo ldconfig
重複 這第6步,直到能正常啓動主程式,一般情況 下經過前面5步後,正常方式 執行應用(myqtapp)或應用啓動器(myqtapp.desktop)後,沒有正常顯示出畫面,才需要這第6步。
7. 最後, ~/myapp資料夾 就是 應用程式包含檔案,一般安裝放入 /opt/myapp內,有變動的檔案安裝一般放入/var/opt/myapp內,必需的Qt庫檔案一般安裝放入 /usr/local/lib/qtapp(參照第5步),目標機器上就安裝完成,最後,建立桌面啓動器(其中 指定了 圖示)
vi myqtapp.desktop
內容是

[Desktop Entry]
Version=1.0
Name=myqtapp
GenericName=myqtapp
Comment=myqtapp
Exec=/opt/myapp/myqtapp
Icon=/opt/myapp/images/myapp.ico
Terminal=false
Type=Application
Categories=Application;
StartupNotify=true
X-Desktop-File-Install-Version=0.22

8.打包,安裝 都完成了。