本文详细记录了在Linux环境下使用Qt开发的应用程序进行打包的过程和方法,包括必要的依赖项安装、配置及注意事项。
### Linux下QT程序打包详解
#### 一、前言与背景
在开发环境中构建QT应用程序后,为了确保程序能够在没有安装QT环境的目标机器上顺利运行,我们需要对程序进行打包处理。本段落将详细介绍如何在Linux环境下完成QT程序的打包工作,包括生成可执行文件、收集依赖库、设置运行环境等关键步骤。
#### 二、准备工作
确保程序已经使用Release模式编译生成了可执行文件。可以通过在项目文件`.pro`中添加以下配置来指定Release模式的输出目录:
```plaintext
CONFIG(debug, debug|release)
DESTDIR = $$PWD/bin_d
CONFIG(release, debug|release)
DESTDIR = $$PWD/bin
```
这样编译完成后,可执行文件会被放置在指定的目录下(例如`bin`或`bin_d`)。假设生成的可执行文件名为`a`,接下来需要准备一个用于打包的文件夹`A`,并将可执行文件`a`放入其中。
#### 三、收集依赖库
打包过程中最关键的一环就是收集所有依赖库,确保它们能够被正确加载。这一步通常通过`ldd`命令来完成,它可以列出可执行文件所需的共享库列表。具体步骤如下:
1. **创建打包脚本**:在文件夹`A`中创建一个名为`pack.sh`的脚本,内容如下:
```bash
#! /bin/sh
exe=a # 需要发布的程序名称为a
des=~/A # a程序所在路径
desplist=$(ldd $exe | awk {if (match($3, /)){printf(%s ,$3)}})
cp $desplist $des
```
2. **运行脚本**:执行`.pack.sh`命令,这将会把所有依赖的库文件复制到文件夹`A`中。
#### 四、设置运行环境
为了让程序在目标机器上能够正常启动,还需要创建一个运行脚本来设置正确的环境变量。具体步骤如下:
1. **创建运行脚本**:在文件夹`A`中创建一个名为`a.sh`的脚本,内容如下:
```bash
#! /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:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
$dirname/$appname $@
```
2. **赋予脚本执行权限**:使用`chmod +x a.sh`命令使脚本具有执行权限。
#### 五、处理图形平台插件
对于使用了QT GUI的应用程序来说,还需要复制图形平台插件。这些插件位于QT安装目录下的`plugins/platforms`文件夹内。具体操作如下:
1. **创建复制库脚本**:在`Qt5.9.3/5.9/gcc_64/plugins/platforms`文件夹下创建一个名为`copylib.sh`的脚本,内容如下:
```bash
#! /bin/bash
LibDir=$PWD/lib
Target=$1
lib_array=($(ldd $Target | grep -o .*/.* | grep -o .*[^[:space:]]*))
mkdir -p $LibDir
for Variable in ${lib_array[@]}
do
cp $Variable $LibDir
done
```
2. **赋予脚本执行权限**:使用`chmod +x copylib.sh`命令。
3. **执行脚本**:运行`.copylib.sh libqxcb.so`,这将在当前目录下创建一个包含所需库文件的`lib`文件夹。
4. **复制插件文件夹**:将`libqxcb.so`所在的`lib`文件夹中的所有库文件复制到打包文件夹`A`中。
#### 六、完成打包
至此,所有必要的步骤都已完成,只需将文件夹`A`复制到目标机器上,并在目标机器中执行`.a.sh`即可运行程序。
#### 七、总结
通过以上步骤,我们可以有效地在Linux环境下完成QT程序的打包工作,确保程序在不同的环境下都能正常运行。需要注意的是,由于不同版本的QT可能存在兼容性差异,因此在实际操作中可能还需要根据具体情况做一些调整。此外,随着新的操作系统版本和QT版本的发布,打包过程中遇到的问题也可能随之变化,建议持续关注最新的文档和技术支持。