Qt 5.12.12 windows和linux打包部署绿色软件

环境:

系统:windows 11/Ubuntu 20.04
Qt: 5.12.12
编译器:vs2017(win)/Mingw7.3.0(win)/gcc 9.4.0(linux)

前言

Qt开发程序后需要打包部署到没有Qt和编译器的纯净系统中正常运行,这就需要把应用程序依赖的Qt动态库(如Qt5Core.dll)、Qt插件库(如platforms/qwindows.dll)、C++运行时库(如vcruntime140.dll msvcp140.dll)以及其他第三方库(如sqlite.dll)打包部署到一起。

1. windows

1.1 msvc

  • 启动Qt命令行(qtenv2.bat)
开始菜单 -> Qt 5.12.12 -> Qt 5.12.12 (MSVC 2017 64-bit)
  • 打包Qt动态库及插件库
windeployqt myapp.exe
  • 复制C++运行时库
vcruntime140.dll
msvcp140.dll
vcruntime140_1.dll
copy C:\WINDOWS\system32\VCRUNTIME140.dll
copy C:\WINDOWS\system32\MSVCP140.dll
copy C:\WINDOWS\system32\VCRUNTIME140_1.dll

目录结构

.
+--- myapp.exe # 主程序

+--- Qt5Core.dll # qt动态库
+--- Qt5Gui.dll # qt动态库
+--- Qt5Widgets.dll # qt动态库
+--- Qt5Svg.dll # qt动态库(SVG图片,未使用可移除)

+--- platforms # qt插件库(必须)
+--- styles # qt插件库
+--- iconengines # qt插件库(icon未使用svg可移除)
+--- imageformats # qt插件库(用到哪种图片格式保留哪个插件)

+--- D3Dcompiler_47.dll # qt动态库(DirectX相关,未使用可移除)
+--- libEGL.dll # qt动态库(OpenGL相关,windeployqt --no-angle --no-opengl-sw可移除)
+--- libGLESV2.dll # qt动态库(OpenGL相关,windeployqt --no-angle --no-opengl-sw可移除)
+--- opengl32sw.dll # qt动态库(OpenGL相关,windeployqt --no-angle --no-opengl-sw可移除)

+--- translations # qt翻译文件(不需要国际化可删除)

+--- vcruntime140.dll # C++运行时库
+--- msvcp140.dll # C++运行时库
+--- vcruntime140_1.dll # C++运行时库

1.2 mingw64

  • 启动Qt命令行(qtenv2.bat)
开始菜单 -> Qt 5.12.12 -> Qt 5.12.12 (MinGW 7.3.0 64-bit)
  • 打包Qt动态库及插件库
windeployqt myapp.exe
  • C++运行时库(windeployqt已打包)
libgcc_s_seh-1.dll
libstdc++-6.dll
libwinpthread-1.dll

目录结构

.
+--- myapp.exe # 主程序

+--- Qt5Core.dll # qt动态库
+--- Qt5Gui.dll # qt动态库
+--- Qt5Widgets.dll # qt动态库
+--- Qt5Svg.dll # qt动态库(SVG图片,未使用可移除)

+--- platforms # qt插件库(必须)
+--- styles # qt插件库
+--- iconengines # qt插件库(icon未使用svg可移除)
+--- imageformats # qt插件库(用到哪种图片格式保留哪个插件)

+--- D3Dcompiler_47.dll # qt动态库(DirectX相关,未使用可移除)
+--- libEGL.dll # qt动态库(OpenGL相关,windeployqt --no-angle --no-opengl-sw可移除)
+--- libGLESV2.dll # qt动态库(OpenGL相关,windeployqt --no-angle --no-opengl-sw可移除)
+--- opengl32sw.dll # qt动态库(OpenGL相关,windeployqt --no-angle --no-opengl-sw可移除)

+--- translations # qt翻译文件(不需要国际化可删除)

+--- libgcc_s_seh-1.dll # C++运行时库
+--- libstdc++-6.dll # C++运行时库
+--- libwinpthread-1.dll # C++运行时库

2. linux

2.1 linuxdeployqt自动打包依赖

  • 下载linuxdeployqt
wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage
chmod +x linuxdeployqt-continuous-x86_64.AppImage
sudo mv linuxdeployqt-continuous-x86_64.AppImage /usr/bin/linuxdeployqt
  • 配置Qt环境变量
export PATH=/opt/Qt5.12.12/5.12.12/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt5.12.12/5.12.12/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt5.12.12/5.12.12/gcc_64/plugins:$PLUGIN_PATH

验证

$ qmake -v
QMake version 3.1
Using Qt version 5.12.12 in /opt/Qt5.12.12/5.12.12/gcc_64/lib
  • 打包
linuxdeployqt myapp -appimage

2.2 通过ldd命令手动打包依赖

  • 编写复制依赖批处理

copylib.sh

#!/bin/bash

# copylib.sh

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
  • 复制依赖库
./copylib.sh myapp

注意:ldd命令只能复制依赖库,不能复制Qt的插件库。

  • 拷贝所需Qt插件库
platforms/libqxcb.so
...
  • 运行程序
export LD_LIBRARY_PATH=`pwd`/lib:$LD_LIBRARY_PATH
./myapp
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐