问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Qt6.8静态编译指南:轻松搞定性能优化!

创作时间:
作者:
@小白创作中心

Qt6.8静态编译指南:轻松搞定性能优化!

引用
CSDN
8
来源
1.
https://blog.csdn.net/aggs1990/article/details/143491893
2.
https://blog.csdn.net/YIRILIANG/article/details/142651873
3.
https://blog.csdn.net/D4G1TIAO/article/details/143381813
4.
https://www.qt.io/blog/qt-configure-options-in-qt-6.8
5.
http://www.kxtry.com/archives/category/uncategorized
6.
https://www.cnblogs.com/Dir-A/p/18278796
7.
https://scythe-studio.com/en/blog/porting-from-qt-5-to-qt-6
8.
https://www.qt.io/blog/reducing-binary-size-of-qt-applications-with-qt-6.8-part-2-coffee-machine-example

在Qt开发中,静态编译是一种重要的构建方式,它能够将所有库文件打包到一个可执行文件中,从而提升程序性能并减少外部依赖。本文将详细介绍如何在Windows环境下使用MSVC2022对Qt6.8进行静态编译,并分享一些性能优化技巧。

01

为什么选择静态编译?

在软件开发中,静态编译和动态编译是两种常见的编译方式。它们的主要区别在于库文件的处理方式:

  • 动态编译:生成的可执行文件依赖于外部动态链接库(.dll文件)。这种方式的优点是代码复用性好,多个程序可以共享同一个库文件,节省磁盘空间。但缺点是需要确保目标系统上已经安装了相应的动态库,否则程序将无法运行。

  • 静态编译:将所有需要的库文件代码直接链接到可执行文件中,生成一个独立的、不依赖外部库的可执行文件。这种方式的优点是程序的可移植性好,部署简单,不需要担心目标系统缺少依赖库的问题。缺点是生成的可执行文件体积较大,因为包含了所有依赖的库代码。

在某些场景下,静态编译是更好的选择:

  1. 独立部署需求:当需要生成一个完全独立的可执行文件,不依赖任何外部库时(例如,某些嵌入式系统或对安全性要求极高的系统)。
  2. 简化部署流程:避免“dll地狱”问题,即不同版本的动态库之间的冲突问题。
  3. 性能优化:静态编译可以带来一定的性能提升,因为避免了动态链接的开销。
02

环境准备

在开始静态编译之前,需要确保以下工具和库已经正确安装:

  1. MSYS2:这是一个Unix-like的环境,用于运行configure脚本。可以从MSYS2官网下载安装。安装后需要安装flex和bison:

    pacman -S flex bison
    
  2. Visual Studio 2022:需要安装C++开发工具。建议使用社区版,免费且功能齐全。

  3. OpenSSL:如果需要使用Qt的网络功能,需要静态编译版本的OpenSSL。可以参考这篇博客进行编译。

  4. Python:Qt的配置和构建过程需要Python,建议使用3.10版本。

  5. Ninja和CMake:可以从Qt官方在线安装包中获取,也可以单独下载。

  6. Perl和Ruby:虽然不是必须的,但某些模块可能需要这些工具,建议安装。

03

下载Qt源码

从Qt官方网站下载Qt6.8的源码包:
https://download.qt.io/official_releases/qt/6.8/6.8.0/single/qt-everywhere-src-6.8.0.zip

解压到一个没有空格和中文的目录,例如:

G:\Qt\6.8.0\Src\qt-everywhere-src-6.8.0
04

配置静态编译

  1. 修改配置文件
    打开qtbase\mkspecs\common\msvc-desktop.conf,将所有-MD替换为-MT,以启用静态运行时。

  2. 设置环境变量
    打开VS2022的x64原生工具命令提示符,设置以下环境变量:

    set PATH=D:\Qt\Tools\llvm-mingw1706_64\bin;D:\Qt\Tools\CMake_64\bin;D:\Qt\Tools\Ninja;D:\Ruby33-x64\bin;D:\Perl64\bin;%PATH%;D:\msys64\usr\bin;
    set OPENSSL_ROOT_DIR={openssl_dir}\openssl-3.3.2\install_static
    set OPENSSL_USE_STATIC_LIBS=ON
    
  3. 配置Qt源码
    在源码目录下创建一个build目录,然后运行configure命令:

    cd ..
    mkdir build
    ..\qt-everywhere-src-6.8.0\configure -static -static-runtime -prefix "D:\Qt\6.8.0\msvc2022_64_static" -debug-and-release -platform win32-msvc -nomake examples -nomake tests -qt-zlib -qt-libpng -qt-libjpeg -opengl dynamic -openssl-linked
    

    关键选项解释:

    • -static:启用静态编译
    • -static-runtime:启用静态运行时
    • -prefix:指定安装目录
    • -debug-and-release:同时编译调试和发布版本
    • -platform win32-msvc:使用MSVC编译器
    • -openssl-linked:静态链接OpenSSL库
05

编译与安装

  1. 编译源码

    cmake --build . --parallel 6
    

    这里使用6个线程进行并行编译,可以根据CPU核心数调整。

  2. 安装Qt

    ninja install
    
06

性能优化技巧

  1. 模块选择
    Qt框架包含50多个模块,开发者可以根据需要选择性地包含这些模块。通过精简不必要的模块,可以显著减小二进制文件的大小。

  2. 链接时代码生成(LTCG)
    使用-ltcg配置选项可以进一步优化运行时性能。这个选项会在链接阶段进行代码优化,但可能会增加编译时间。

  3. 优化编译选项
    可以通过CMake或configure脚本传递额外的编译器优化选项,例如-O2-O3,以获得更好的性能。

  4. 使用Qt Configure Options
    Qt 6.8提供了丰富的配置选项,开发者可以根据应用需求定制Qt框架,实现更小的内存占用和更快的启动速度。

通过以上步骤,你可以成功地在Windows环境下使用MSVC2022对Qt6.8进行静态编译,并通过合理的优化策略提升程序性能。虽然静态编译会增加编译时间和可执行文件的大小,但带来的性能提升和部署便利性往往值得这些代价。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号