一、环境介绍
操作系统环境: ubuntu18.04 64位
QT版本: 5.12
二、打包发布的过程
1. 先使用Release 编译QT程序
2. 程序编译成功后,会在指定目录下生成一个文件夹,里面就包含了可执行程序。
比如: build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release
3. 在这个(build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release)目录下一个脚本文件
比如: lib_copy_qt.sh 代码如下:
代码语言:javascript复制#!/bin/bash
if [ $# != 1 ]
then
echo "传参数顺序: ./脚本.sh <要发布的可执行文件文件>"
exit 0
fi
LibDir=$PWD/lib
mkdir $LibDir
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
这个脚本的功能就是查找可执行文件的依赖库,将依赖库拷贝到当前目录下的lib文件夹里(这个lib是脚本创建的)。
linux的ldd命令也可以查找可执行文件的依赖库,这个脚本的功能和ldd命令功能一样,写成脚本是为了方便,查找之后就拷贝过来。
ldd命令使用方法示例:
代码语言:javascript复制wbyq@wbyq:~/qt_code$ ldd build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release/ffmpeg_code
linux-vdso.so.1 (0x00007ffe7a5dd000)
libavcodec.so.58 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libavcodec.so.58 (0x00007f0c8a764000)
libavutil.so.56 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libavutil.so.56 (0x00007f0c8a457000)
libavdevice.so.58 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libavdevice.so.58 (0x00007f0c8a244000)
libavformat.so.58 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libavformat.so.58 (0x00007f0c89deb000)
libswscale.so.5 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libswscale.so.5 (0x00007f0c89b60000)
libQt5Widgets.so.5 => /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib/libQt5Widgets.so.5 (0x00007f0c89311000)
libQt5Gui.so.5 => /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib/libQt5Gui.so.5 (0x00007f0c88ac4000)
libQt5Core.so.5 => /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib/libQt5Core.so.5 (0x00007f0c88329000)
libstdc .so.6 => /usr/lib/x86_64-linux-gnu/libstdc .so.6 (0x00007f0c87fa0000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0c87d88000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0c87997000)
libswresample.so.3 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libswresample.so.3 (0x00007f0c8777a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0c873dc000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f0c871bf000)
libx264.so.157 => /home/wbyq/work_pc/x264-snapshot-20181217-2245/_install/lib/libx264.so.157 (0x00007f0c86c93000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0c86a74000)
libavfilter.so.7 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libavfilter.so.7 (0x00007f0c8654c000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f0c86324000)
libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007f0c86120000)
libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007f0c85f18000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007f0c85c11000)
libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f0c85985000)
libicui18n.so.56 => /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib/libicui18n.so.56 (0x00007f0c854ec000)
libicuuc.so.56 => /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib/libicuuc.so.56 (0x00007f0c85134000)
libicudata.so.56 => /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib/libicudata.so.56 (0x00007f0c83751000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0c8354d000)
libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f0c8334b000)
libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f0c83034000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0c8c06b000)
libpostproc.so.55 => /home/wbyq/work_pc/ffmpeg-4.2.2/_install/lib/libpostproc.so.55 (0x00007f0c82e16000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f0c82c12000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f0c82a0c000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0c82804000)
libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f0c825d3000)
libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f0c8231d000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f0c820ab000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f0c81e96000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f0c81b5e000)
脚本的使用方法示例:
代码语言:javascript复制wbyq@wbyq:~/qt_code$ cd build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release/
wbyq@wbyq:~/qt_code/build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release$ ./lib_copy_qt.sh ffmpeg_code
wbyq@wbyq:~/qt_code/build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release$ ls
ffmpeg_code lib_copy_qt.sh mainwindow.o moc_mainwindow.cpp moc_predefs.h
lib main.o Makefile moc_mainwindow.o ui_mainwindow.h
wbyq@wbyq:~/qt_code/build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release$
执行完这一步之后,在当前目录下就会生成一个lib文件夹,然后在其他再创建一个目录,当做最终的APP发布存放目录。
比如: camera_linux_app
(1). 将上一步生成的lib目录下的所有文件拷贝到camera_linux_app目录下。
(2). 将build-ffmpeg_code-Desktop_Qt_5_12_6_GCC_64bit-Release目录下的程序可执行文件也拷贝到camera_linux_app目录下。
(3). 为了发布过程不出现各种BUG,找不到库、找不到平台等等一系列问题,现在使用一个笨办法。
将QT使用的编译器目录下的所有库拷贝到camera_linux_app目录下,有覆盖的就不管。
我的目录路径是: /home/wbyq/Qt5.12.6/5.12.6/gcc_64/lib
(4). 将QT使用的编译器目录下的plugins文件夹拷贝到camera_linux_app目录下。
(5). 在camera_linux_app目录下编写一个app启动脚本。 脚本名称和可执行程序的名字样,后缀为.sh。
比如: 我的可执行程序名字是ffmpeg_code 。那么脚本的名字就是ffmpeg_code.sh
代码如下: (因为我的程序用到了FFMPEG相关的库,所有里面加了FFMPEG相关的东西)
代码语言:javascript复制#!/bin/sh
LD_LIBRARY_PATH=$PWD/ffmpeg_x264/ffmpeg/lib:$PWD/ffmpeg_x264/x264/lib:$LD_LIBRARY_PATH
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
PATH=$PATH:$PWD/ffmpeg_x264/ffmpeg/bin
echo "PATH=$PATH"
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
echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH
export PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=$PWD/plugins
$dirname/$appname "$@"
(6). 脚本代码编写好之后,都要修改权限为可执行。 例如: chmod 777 xxx.sh
(7). 将camera_linux_app目录打包。例如: tar cvf camera_linux_app.tar camera_linux_app/
(8). 接下来就可以将这个打包的文件拷贝到其他没有QT环境的电脑上解压运行了。
运行的时候,执行(camera_linux_app)目录下的脚本文件(ffmpeg_code.sh)即可。
这样打包占用的空间比较大,拷贝了很多没有用到的库,但是不会出现各种库缺失的问题。。