【Qt】打包发布安装程序

版权声明:本文为博主原创文章,转载注明出处 https://blog.csdn.net/u010875635/article/details/71915589

以下讲述如何将Qt写的程序打包成一个run文件,进行一键安装。

       
先建立一个文件夹,下面建立三个文件夹,fonts,plugins,lib,分别放置字体,ui平台以及库,qt可执行程序也放到lib中,后面会使用c语言程式设定临时环境变量,然后调用程序。

       
字体为ui中使用的字体,安装完成后执行程序会自动在安装寻找,lib也是一样,一般是libQt5Core.so等等,注意Qt5的ui会使用到libQt5DBus和libQt5XcbQpa,将需要字体和库分别拷贝到两个文件夹。将Qt的plugins中的platforms拷贝到plugins中,若是只需要某个平台,则只拷贝一个so库即可,例如libxcb.so。

Qt中设置自定义(windows下copy出字体)字体方式如下,在项目下新建一个fonts文件夹,然后将需要的字体复制进入,例如simsun.ttc,然后在Qt加载。

int nIndex = QFontDatabase::addApplicationFont("./fonts/simsun.ttc");
    if (nIndex != -1)
    {
        QStringList strList(QFontDatabase::applicationFontFamilies(nIndex));
        if (strList.count() > 0)
        {
            QFont fontThis(strList.at(0));
            fontThis.setPointSize(9);
            a.setFont(fontThis);
            qDebug()<<"Load simsun success";
        }
    }


将以下脚本复制并保存为.sh文件,赋予执行权限,执行时带上lib中程式的名称,例如./packageQtexec.sh 

testUI,最终生成的会是一个run文件,可以直接安装,安装路径在/opt下,并创建软连接到/bin下,安装目录里会有一个对应的uninstall.sh用于卸载。

#!/bin/bash
############
# create run file for qt program
###########

libdir="./lib"
pluginsdir="./plugins"
fontsdir="./fonts"

cfile="main_tmp.c"

DATE=$(date +%Y%m%d)
outtmpdir="my$1"
programname=$1

targetDir="/opt/$outtmpdir"
targetlibDir="/opt/$outtmpdir/lib"
targetpluginsDir="/opt/$outtmpdir/plugins"
targetfontsDir="/opt/$outtmpdir/fonts"

function checkparameters()
{
	if [ $# != 1 ]; then 
		echo "Please run with program name! example: packageQtexec.sh Test"
		exit 1;
	fi

	if [ ! -f "$libdir/$1" ]; then
	  echo "$libdir/$1 : File is not exist!"
	  exit 1;
	fi
	
}

function checkdirs()
{
	if [ ! -d "$libdir" ]; then  
	  echo "lib directory is not found!"
	  exit 1;
	fi 

	if [ ! -d "$pluginsdir" ]; then
	  echo "plugins directory is not found!"
	  exit 1;
	fi 

	if [ ! -d "$fontsdir" ]; then  
	echo "fonts directory is not found!"
	  exit 1;
	fi 

}


function createCprogram()
{
	echo "#include <stdio.h>"  >> $cfile
	echo "#include <stdlib.h>" >> $cfile
	echo "int main()" >> $cfile
	echo "{" >> $cfile
	echo "	char *var, *value;" >> $cfile
	echo "	putenv(\"LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$targetlibDir\");" >> $cfile
	echo "	putenv(\"QT_QPA_PLATFORM_PLUGIN_PATH=$targetpluginsDir\");" >> $cfile
	echo "	putenv(\"QT_QPA_FONTDIR=$targetfontsDir\");" >> $cfile
	echo "	system(\"$targetlibDir/$1\");" >> $cfile
	echo "}" >> $cfile
}

function createInstall()
{
	rm -rf $2
	echo "#!/bin/bash" >> $2
	echo "lines=8 #this file total row + 1" >> $2
	echo "tail -n +\$lines \"\$0\" >/tmp/$outtmpdir.tar.bz2 # write self from filelines to file。" >> $2
	echo "tar -jxvf /tmp/$outtmpdir.tar.bz2 -C /opt" >> $2
	echo "rm -f /tmp/$outtmpdir.tar.bz2" >> $2
	echo "ln -sf $targetDir/$programname /bin" >> $2
	echo "exit 0" >> $2
}

function createunInstall()
{
	rm -rf $2
	echo "#!/bin/bash" >> $2
	echo "rm -rf $targetDir" >> $2
	echo "rm -rf /bin/$programname" >> $2
	echo "rm \$0"
	echo "exit 0" >> $2

	chmod +x $2
}

rm -rf $cfile

checkparameters $@

checkdirs

createCprogram $@

gcc -o $1 $cfile

rm -rf $cfile $outtmpdir $outtmpdir.run $outtmpdir.tar.bz2

mkdir $outtmpdir

createunInstall $outtmpdir uninstall.sh

cp uninstall.sh $outtmpdir

rsync -av --exclude *.o --exclude *.c --exclude *.cpp --exclude *.h --exclude $outtmpdir/ --exclude Makefile --exclude *.sh ./* $outtmpdir


tar -cjvf $outtmpdir.tar.bz2 $outtmpdir --exclude=*.o --exclude=*.c --exclude=*.cpp --exclude=*.h --exclude=$outtmpdir/ --exclude=Makefile --exclude=$0

rm -rf $outtmpdir

#echo $0
createInstall $outtmpdir myinstall.sh

cat myinstall.sh $outtmpdir.tar.bz2 > $outtmpdir.run
chmod +x $outtmpdir.run
rm -rf  uninstall.sh $outtmpdir.tar.bz2 myinstall.sh $programname


猜你喜欢

转载自blog.csdn.net/u010875635/article/details/71915589