爲便於描述,咱們這裏假設生成的程序名稱爲test(即要發佈的程序名稱)
方法一:
1. QtCreate使用Release版本編譯
將編譯後生成的可執行程序(如:test)複製到一個空目錄下
sql
2.使用ldd命令查看和導出須要的庫數據庫
在步驟1的目錄下新建一個pack.sh文件,文件內容以下:bash
#!/bin/sh
app
exe="test" #你須要發佈的程序名稱
ui
des="/home/someone/QtProject/build-test-Desktop-Release/Test" #步驟1中的目錄即本文件所在目錄
spa
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
插件
cp $deplist $des
code
文件中有兩處中文註釋的地方須要修
3.編寫執行程序的sh文件
在此目錄下再新建一個test.sh文件(文件名必須與可執行文件名字同樣),
文件內容以下(不須要修改):orm
#!/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生成的可執行程序
方法二:
打包發佈Linux 版Qt應用
一、把編譯的應用 主程序(例如 myqtapp) 複製 到 另外一簡單起名的文件夾,例如 主目錄下 ~/myapp
(把應用所需的SQLite等數據庫也一同放入,或者放入程序代碼指定的位置,例如 /var/opt內的位置,程序使用的普通圖片,按代碼指定也放入指定位置或 ~/myapp內,例如,個人是放在 ~/myapp/images)
二、程序須要用到的各個插件也從Qt安裝目錄中複製到主程序目錄內
(例如在 /opt/Qt5.8.0/5.8/gcc_64/plugins ,我用到 platforms 、 sqldrivers 和 imageformats,其中 platforms我只用到 libqxcb.so,則platforms夾內需libqxcb.so一個文件便可,sqldrivers是SQLite,Mysql驅動,imageformats是圖片調用須要)
三、複製必須的 庫文件 ,先創建 腳本(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.5六、libicui18n.so.5六、libicuuc.so.5六、libQt5Core.so.五、libQt5DBus.so.五、libQt5Gui.so.五、libQt5Network.so.五、libQt5PrintSupport.so.五、libQt5SerialPort.so.五、libQt5Sql.so.五、libQt5Widgets.so.5件和文件名中包含xcb的所有文件,例如 libX11-xcb.so.一、libxcb.so.1等
(libQt5Network.so.五、libQt5PrintSupport.so.五、libQt5SerialPort.so.五、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.五、libQt5XcbQpa.so.五、和文件名中包含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