[Abstract]: 在Qt on Linux上開發程序完成後須要脫離本機所營造的開發庫環境變量運行,則須要對二進制執行文件進行打包發佈。在Ubuntu系統中一般使用deb格式文件對二進制安裝包進行封裝。Ubuntu系統提供了我的軟件包(Personal Package Archives, PPA)在線安裝deb功能。本文闡述在Linux系統中使用Qt編譯生成的二進制文件收集*.so庫文件過程、Ubuntu的deb打包過程,完成從Qt編譯生成的二進制文件到發佈到Ubuntu我的軟件包文檔全過程。html
使用Qt Creator開發的項目工程文件在release或debug模式下生成的二進制文件依賴於Qt Creator的環境變量,這是一個Qt運行庫完整的環境變量。當二進制文件脫離該環境會提示加載依賴庫失敗。Linux系統ldd命令(ldd app
)能夠顯示二進制文件依賴庫。文獻1提供了自動收集庫文件的腳本。c++
對其進行改造命名爲qt-lib-collect.sh,輸入參數1目標文件,輸入參數2庫文件存儲路徑。shell
#!/bin/sh # 可執行程序名 appname=$1 # 目標文件夾 dst=./$2 # 利用 ldd 提取依賴庫的具體路徑 liblist=$(ldd $appname | awk '{ if (match($3,"/")){ printf("%s "), $3 } }') # 目標文件夾的檢測 if [ ! -d $dst ];then mkdir $dst fi # 拷貝庫文件和可執行程序到目標文件夾 cp $liblist $dst cp $appname $dst
eg: ./qt-lib-collect.sh app out_dir
json
文獻2提供整理了方法。使用deb打包,須要先建立符合deb格式規則的文件夾。在deb包中包括,DEBIAN
目錄和目標軟件安裝路徑文件夾
,例如,建立mydebpac文件夾,符合deb格式的最小文件夾結構爲:bash
DEBIAN
,規定包含changlog contro copyright postinst postrm prerm
文件,這些文件對deb進行描述,須要按照deb定義的字段格式填寫。/opt
:視爲用戶使用dpkg -i安裝該deb時,該包的安裝文件會解壓到用戶的/opt路徑下,同理若設定爲/usr,則會解壓到/usr下。postinst
:腳本文件。在文件目錄拷貝後執行。相應地,preinst爲文件安裝前執行腳本。prerm
:腳本文件。在文件目錄卸載掉前執行。相應地,postrm爲文件卸載後的執行腳本。contro
:deb文件包描述,其內容有包名稱、版本、依賴庫、包介紹等。全部的腳本文件,都須要預先給定執行權限chmod +x ....
app
Package: tinySerial Version: v1.1 Section: free Priority: optional Depends: libssl.0.0.so, libstdc++2.10-glibc2.2 Suggests: Openssl Architecture: amd64 Installed-Size: 61952 Maintainer: carlos.wei.hk@gmail.com Provides: mysoftware Description: tinySerial is a opensource GUI serial port debug software on Linux.
在postinst內能夠寫一些處理快捷方式、配置環境變量的操做。ide
# !/bin/sh cp /opt/tinyserial/tinyserial.desktop /usr/share/applications cp /opt/tinyserial/tinyserial /usr/bin
筆者會作兩個處理:post
/usr/share/applications
/usr/bin
中與postinst回滾執行的文件。spa
# !/bin/sh rm /usr/share/applications/tinyserial.desktop rm /usr/bin/tinyserial
dpkg -b tinyserial tinyserial-v1.1.deb
.net
安裝deb包:
dpkg -i mydeb.deb
卸載deb包:
dpkg -r mysoftware
查看deb包是否安裝:
dpkg -s mysoftware
查看deb包文件內容:
dpkg -c mydeb.deb
查看當前目錄某個deb包的信息:
dpkg --info mydeb.deb
dpkg -X mydeb.deb mydeb
解壓deb包中DEBIAN目錄下的文件(至少包含control文件)
dpkg -e mydeb.deb mydeb