怎么在linux下打包免安装的QT程序。

近期,因为项目的需求,得打包QT程序,并将程序放到没有安装QT库的电脑上运行。
打包QT程序的方法有很多,主要分为以下几种:
1.打包成安装包形式:
2.打包成二进制文件,附带运行库的形式;
==Windows下,有很多的工具,教程也比较多,运行库基本是dll文件
==linux下,需要靠脚本协助,很多教程都不完整,运行库基本是so文件

这里演示在linu文件下打包免安装的程序,程序名称叫giptables,QT版本是5.6.0,以下如出现这个名字,一律换成读者自己的应用程序名称。

1.找个地方,将用来存放比如桌面,创空文件夹Process,这个文件夹程序的运行文件。
2.先将工程使用Release模式编译
3.打开编译输出文件的文件夹(带二进制文件giptables的那个)
一般如果在创建项目时勾选了shadow选项的,编译生成的文件存放在build–文件夹中
如果没有勾选,编译生成的文件被放在了源文件夹中。
4.在编译生成的文件中新建一个脚本文件 install.sh,通过指令chmod 777 install.sh
5.向install.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

6.打开终端进入到当前文件夹,输入./install.sh
process(此处为可执行程序的名字)

  其中,process是运行脚本install.sh脚本的参数,
  脚本实际调用了ldd process指令时获得process运行时需要哪些库,并将库都复制放到当前目录的lib文件夹中。

运行完上述的指令后,同目录下会生成lib文件夹,这里我们将其称作process的库文件夹中,注意:这里是把lib里面的文件复制出来,并放到自己创建的文件夹的名字里面,不用复制lib文件夹。

7.进入QT的安装目录,找到platforms文件夹,笔者的路径是:
/home/Qt5.6.0/gcc_64/plugins/platforms

将整个platform文件夹复制到process文件夹中,
注意此时复制的是整个文件夹,这使得process文件夹中会多出一个platform文件夹
8.将上文的install.sh文件放到process/platfroms/中,运行./install.sh libqxcb.so,这时会得到lib文件夹——libqxcb.so的库文件夹

9.将libqxcb.so的库文件夹中的所有文件复制到process文件夹中,然后删除process/platfroms/lib文件夹

10.在process文件夹中新建脚本文件
process(程序的名称).sh,执行chmod 777 process.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 "$@"

这里我们已经制作完成了一个文件安装包,运行程序采用 ./process.sh的形式,即运行程序的sh脚本,而不是二进制文件

运行过程中的问题:
注意:1. 运行.sh时报找不到库的错误, 必须在源文件中运行install.sh,而不能先将可执行文件赋值出来,然后再运行install.sh生成lib

 2.在目标机中提示
    This application failed to start because it could not find or load the Qt platform plugin “xcb”

这是因为没有生成libqxcb.so的库文件,或者没有将生成的文件夹中所有的文件放到 process.sh同一级目录下。

1.Qt编译器: release ,build
2.创建Process文件夹,
3.在build中创建脚本文件install.sh, 运行脚本文件./install.sh process(程序名) 会生成lib库文件
4.将build/lib文件夹中的文件拷贝到Process文件夹中
5. 将Qt安装文件下的platfrom复制到Process文件夹中,并将install.sh放入,
运行./install .sh libqxcb.so 这时会得到一个lib文件,将lib中的文件都复制到 Process文件夹中,
也就是当前文件夹lib的上一级;

可以看出最终的文件夹层次结构是:
(1)……..so
Process (4) install.sh
(2) platfroms(文件夹)
(5) platfroms文件夹中本来的内容(*.sh)
(3)process.sh

复制文件的技巧: *(代表所有的文件)

原创文章 59 获赞 39 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_28174951/article/details/78313608