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

Qt5.6.3静态编译:Windows兼容性攻略

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

Qt5.6.3静态编译:Windows兼容性攻略

引用
CSDN
9
来源
1.
https://blog.csdn.net/qiexinyueaifei/article/details/137494684
2.
https://blog.csdn.net/kalekale/article/details/109285180
3.
https://m.blog.csdn.net/za12192019/article/details/140315519
4.
https://wenku.csdn.net/doc/6yc3izawy3
5.
https://wenku.csdn.net/doc/2rv2cjfjy9
6.
https://doc.qt.io/qtlicenseserver/qls-how-to-install-service.html
7.
https://www.cnblogs.com/eaglexmw/p/18140231
8.
https://www.state-machine.com/qm/history.html
9.
https://wiki.qt.io/Qt_5.14_Tools_and_Versions

Qt5.6.3的静态编译技术在保证跨Windows版本兼容性方面有着重要作用。通过静态编译,开发者可以确保应用程序在不同版本的Windows系统上都能顺利运行,无需担心依赖库的缺失或版本冲突问题。本文详细解析了Qt5.6.3静态编译的优缺点,并提供了具体的跨版本兼容性解决方案,帮助开发者更好地掌握这项关键技术。

01

为什么选择静态编译?

在Windows平台上开发Qt应用程序时,经常会遇到依赖库版本不兼容的问题。例如,新版本的Windows系统可能已经更新了某些系统库,而旧版本的系统可能缺少这些库。这导致在新系统上开发的程序无法在旧系统上正常运行。静态编译正是解决这一问题的关键技术。

静态编译的核心思想是在编译阶段将所有需要的库文件直接链接到可执行文件中,而不是在运行时动态加载。这样生成的可执行文件包含了所有必要的代码和数据,不再依赖于外部的动态链接库(DLL)。因此,静态编译的程序具有以下显著优势:

  1. 跨平台兼容性:由于所有依赖都已嵌入可执行文件,程序可以在不同版本的Windows系统上无缝运行,无需担心系统库的版本差异。

  2. 易于部署:静态编译后的程序不再需要分发大量的DLL文件,简化了应用程序的部署过程。用户只需运行一个独立的可执行文件即可。

  3. 安全性提升:避免了因系统中存在恶意DLL而可能导致的安全隐患。

然而,静态编译也带来了一些缺点:

  1. 可执行文件体积增大:由于包含了所有依赖库的代码,静态编译后的程序体积通常会比动态编译的版本大很多。

  2. 更新不便:如果某个依赖库需要更新(例如修复安全漏洞),在静态编译的情况下,必须重新编译整个应用程序。

  3. 开发效率降低:静态编译通常比动态编译耗时更长,尤其是在大型项目中。

02

静态编译的准备工作

在开始Qt5.6.3的静态编译之前,需要确保已经安装了以下工具和环境:

  1. Visual Studio 2017:选择VS2017是因为Qt5.6.3是支持Windows XP的最高版本,而VS2017是最后一个支持XP的编译器版本。

  2. Python 3.9.13:用于Qt的配置脚本。虽然有说法需要控制Python版本,但实践表明3.9.13版本可以正常工作。

  3. ActivePerl 5.22.1:Qt的构建系统需要Perl支持。

  4. Ruby 2.4.2:某些Qt模块的构建需要Ruby。

  5. jom:这是Qt官方推荐的并行构建工具,可以显著加快编译速度。虽然不是必需的,但强烈建议安装。

03

配置与编译步骤

  1. 打开VS2017的命令行工具:在开始菜单中找到“x86 Native Tools Command Prompt for VS 2017”,这将打开一个已经配置好MSVC编译环境的命令行窗口。

  2. 切换到Qt源码目录:使用cd命令切换到Qt5.6.3源码所在的目录。

  3. 运行configure命令:这是静态编译的关键步骤,需要指定一系列参数来控制编译行为。以下是一个典型的configure命令示例:

    configure -opensource -confirm-license -platform win32-msvc2017 -target xp -debug-and-release -static -DUSING_V110_SDK71 -qt-zlib -qt-libpng -qt-libjpeg -qt-pcre -skip qtwebengine -nomake tests -no-compile-examples -nomake examples -mp -prefix "F:\QT5.6.3Source\second_install"
    

    让我们分析一下这些参数的含义:

    • -opensource:指定使用开源版本的Qt许可证。
    • -confirm-license:自动确认许可证协议,避免交互式提示。
    • -platform win32-msvc2017:指定目标平台和编译器。
    • -target xp:明确指出目标系统为Windows XP,确保兼容性。
    • -debug-and-release:同时构建调试和发布版本。
    • -static:这是最关键的参数,指定进行静态编译。
    • -DUSING_V110_SDK71:定义预处理器宏,用于启用XP兼容模式。
    • -qt-zlib等:指定使用Qt自带的库,而不是系统库。
    • -skip qtwebengine:跳过不需要的模块以减少编译时间。
    • -mp:启用多核编译,加快编译速度。
    • -prefix:指定安装目录。
  4. 开始编译:configure命令执行成功后,接下来就是实际的编译过程。如果安装了jom,可以使用以下命令加速编译:

    jom /J 16
    

    这里的/J 16表示使用16个并行任务进行编译。如果没有jom,也可以使用传统的nmake命令,但编译时间会更长。

  5. 安装:编译完成后,使用以下命令进行安装:

    jom install
    

    或者

    nmake install
    
04

解决Windows兼容性问题

为了确保程序能在Windows XP等旧系统上运行,还需要进行一些额外的配置:

  1. 使用Windows SDK 7.1:这是支持XP的最后一个SDK版本。需要在系统环境变量中添加SDK的路径:

    WINSDK7_1_HOME=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A
    

    并在PATH变量中添加:

    %WINSDK7_1_HOME%\bin;%WINSDK7_1_HOME%\include;%WINSDK7_1_HOME%\lib;
    
  2. 修改pro文件:在Qt项目文件(.pro)中添加以下内容,以确保使用正确的子系统版本:

    win32 {
        QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5.01
        QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE,5.01
        DEFINES += _ATL_XP_TARGETING
        QMAKE_CFLAGS += /D_USING_V110_SDK71_
        QMAKE_CXXFLAGS += /D_USING_V110_SDK71_
        LIBS += -L$$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib)
        INCLUDEPATH += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include)
        QMAKE_TARGET_OS = xp
    }
    
05

部署与测试

  1. 使用windeployqt工具:这是Qt自带的部署工具,可以自动复制程序运行所需的dll文件。在命令行中运行:

    windeployqt your_application.exe
    
  2. 手动拷贝必要dll:由于是静态编译,理论上不需要额外的dll。但某些系统组件(如C++运行时库)仍需手动拷贝。从VS2013的安装目录中找到以下文件并拷贝到程序目录:

    • msvcp120.dll
    • msvcr120.dll
  3. 在XP系统上测试:将生成的可执行文件和必要的dll文件打包,然后在Windows XP系统上测试运行。如果一切配置正确,程序应该能够正常启动和运行。

通过以上步骤,你就可以成功地使用Qt5.6.3在Windows平台上进行静态编译,并确保程序具有良好的跨版本兼容性。虽然静态编译会带来一些额外的工作量,但考虑到它带来的便利性和安全性提升,这种技术在实际开发中仍然具有很高的应用价值。

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