Linux系统下实现QT程序打包发布

简介: Linux系统下实现QT程序打包发布

一、环境介绍


操作系统环境: 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   代码如下:

#!/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命令使用方法示例:  

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)

脚本的使用方法示例:

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相关的东西)

#!/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)即可。


  这样打包占用的空间比较大,拷贝了很多没有用到的库,但是不会出现各种库缺失的问题。

目录
相关文章
|
2月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
2月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
772 10
|
2月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
322 0
|
2月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
118 0
|
2月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
208 0
|
2月前
|
Ubuntu Linux 图形学
Linux学习之Linux桌面系统有哪些?
Cinnamon:与MATE类似,Cinnamon 拥有 GNOME 和 Unity 等其它桌面环境所没有的种种功能,是高度可定制的桌面环境,不需要任何外部插件、窗口组件和调整工具来定制桌面。
125 0
|
2月前
|
Ubuntu 安全 Linux
十款常用Linux系统介绍
本文不是什么大盘点。市面上有好几百款发行版,每款发行版在某个方面都与众不同。不可能在此全部罗列,本文只罗列了十款最常见的Linux发行版(世界上只有两种人,一种是懂二进制的,另一种是不懂二进制的)。请宣传Linux的魅力或威力。
|
Linux
farsight--Linux下qt4移植
  一、到内核查看是否支持LCD驱动、framebuffer cd  /source/kernel/linux-2.6.8.1-farsight/ make menuconfig 在界面中找到Graphics support 进入查看Support for framebuffer devices 和 S3C2410 LCD framebuffer support两个选项是否被选中,选中代表内核已支持。
1143 0
|
27天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
103 16
|
19天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。