版权声明:本文为博主原创文章,转载注明出处 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