您的位置:首页 > 运维架构 > Linux

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

2017-10-22 21:42 405 查看
近期,因为项目的需求,得打包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

复制文件的技巧: *(代表所有的文件)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt