Qt 5.15的源码编译(Windows)

2023-05-16

前言:在技术革新如此之快的时代,Qt也在为适应这些变化发生着重大的改变。又一长期(3年)支持版Qt 5.15 LTS在2020年3月发布,重大更新的大版本Qt 6.0也在2020年12月发布。但是,Qt的策略也发生了变化。从Qt 5.15开始,安装Qt需要Qt账户,今后的长期支持版将对只针对商业用户,离线安装包也只针对商业用户开放。这意味着,开源用户已经没法像以前直接下载安装包安装Qt,只能通过在线安装工具安装Qt,而且需要通过升级安装将来发布的小补丁版本来使用该长期支持版。详见.
当然,我们还是可以手动编译安装Qt,这个办法只要Qt还是开源的就永远是可行的。这也是本文主要分享的。本文适用于:Qt5.15 + windows + msys2(mingw64)。

编译源码参考资料

首先下载源代码,如果网速过慢,可以用tuna镜像。
解压源码到你想要保存的位置,进入源代码根目录。注意,源码根目录所在层级一定不要太深太长,免得因windows路径长度限制导致奇怪问题。

经验:根目录下的README可以仔细看看,这是编译当前源码最直接的资料

Qt官网的一些编译指导文档。
Supported Platforms
Qt for windows
Qt for Windows - Requirements
Qt for Windows - Building from Source
Qt Configure Options
Building Qt 5 from Git
MinGW-64-bit

所需依赖-总结

  1. msys2
    如你所见,Qt项目依赖了跟多其他开源项目,如果单纯地使用mingw64编译,会因为缺少很多其他开源库,而无法进行编译。msys2是个很优秀的项目。它将linux下的很多工具和库移植到了windows上,并提供一套类linux的shell环境和完善的编译工具链,方便开发者编译,安装,运行原生windows软件。通过使用msys2的Arch Linux包管理工具pacman,可以很方便自由地安装我们需要的库。 下载
  2. openGL ANGLE
    Qt Quick 2 需要 OpenGL 2.1(或者更高版本) 或者OpenGL ES 2.0 才能工作。
    在Windows上, 有两种办法:
    1. 使用 ANGLE 来将OpenGL调用映射为 DirectX (默认)
    2. 使用Windows系统上显卡厂商提供的原生OpenGL 驱动
      Qt 5中已经集成了一份ANGLE。如果要使用方法1,对于mingw编译,你需要安装 DirectX SDK。
      如果要使用方法2,你需要确保你的显卡驱动支持OpenGL 2.1 或者更高版本 (注意:微软官方的Windows驱动仅支持OpenGL 1.1,这显然是不够的),然后在使用configure时加上参数’-opengl desktop’。暂时使用-opengl desktop ,angle待以后有时间再研究安装。
  3. ICU
    Qt 5 可以通过 ICU 库来得到UNICODE和 Globalization支持。 构建Qt Webkit时将会用到。
    QtWebkit:在Qt5.6以前,都是使用QtWebkit组件,但Qt5.6以后,移除了QtWebkit这个组件
    QtWebEngine:Qt5.6以后的MSVC版本,引进了基于Chromium的浏览器引擎 QtWebEngine
    QAxWidget:Qt5.6以后的mingw版本,由于移除了Qt Webkit,mingw版本不能使用QtWebEngine,因此只能使用QAxWidget控件。
    ICU可以通过msys2快速安装。
  4. openSSL
    Qt使用openSSL以支持SSL网络通信。openSSL可以通过msys2快速安装。
  5. Python 3 以上(编译Qml需要)
  6. Perl 5.8 以上 Perl可以通过msys2快速安装。

另外,Qt还依赖一些小的第三方库,已经集成在Qt源码中。包括zlib libjpeg libpng freetype PCRE HarfBuzz-NG等,如果在你的系统检测不到时,将自动使用。也可以在configure时指定,通过加 -qt前缀或-system前缀 指示使用哪个来编译。
如:-qt-zlib指定使用Qt集成的 -system-zlib指定使用本地系统的 但是一开始的配置测试,该怎么让它检测到呢?后面发现似乎可以通过configure时加入-I,-L选项以便让configure可以找到自己安装的库的头文件和库目录

编译Qt源码

如其他开源项目一样,根目录下的configure.bat就是Windows下的配置脚本,configure是linux下的配置脚本。
经过仔细分析这些脚本和项目架构,我并没有走一般的编译路线,而是分工程编译。
实际上,根目录中的configure.bat就是调用qtbase工程目录下的configure.bat,这个才是真正做事的脚本。它做了哪些事呢:确定平台和编译器,生成qmake的makefile,调用make生成qmake,然后会暂停让用户确认版权,执行“配置测试”,产生用户环境的报告 config.summary , 最后qmake生成后将自动调用脚本所在目录下的.pro文件,生成工程的makefile。查看config.summary可以确定Qt检测到的构建环境。
qmake是重点,以后其他所有工程都可交由qmake解析.pro来产生相应工程的makefile,有了makefile,执行make即可生成各个工程的库文件。

qbase工程是Qt的核心工程。我首先单独编译了这个工程。步骤: 创建D:\qt-build\qtbase目录,在该目录中执行构建配置:

D:\qt-src515\qtbase\configure.bat -prefix D:\Qt\Qt5.15.2\mingw1010_64 -debug-and-release -platform win32-g++ -opensource -confirm-license -nomake tests -skip qtwebengine  -qt-zlib -ssl -icu -opengl desktop

说明:-prefix 指定安装将会部署的位置,根据自己情况修改 ; -debug-and-release 指示编译生成debug版和release版的Qt库;-platform win32-g++ 指明编译平台是windows,并使用mingw编译器; -opensource -confirm-license 是为了自动确认开源证书,免得到时暂停手动确认;-nomake tests 不需要编译测试工程; -skip qtwebengine 暂时先不编译webengine模块,因为太大了 ;-qt-zlib -ssl -icu 指示检测这些库,并在需要时使用;-opengl desktop 明确指示使用你windows上安装的opengl驱动来编译程序,但这样编译出的程序在别的电脑上运行时需要目标电脑上安装的opengl驱动能兼容你的程序

关于命令选项的具体细节,可参考qtbase\config_help.txt。如上所述,配置成功后,就有了qtbase工程的makefile,现在可以执行make进行编译了:

mingw32-make -j16    #开启十六线程编译,根据自己电脑实际核心数调整

qmake的具体调用:qmake调用qbase.pro,-> load(qt_parts.prf) -> load(qt_configure.prf),
这里2356行函数在做环境测试,2394行qtConfProcessOutput输出Src和mkspecs下的所有文件。

make成功后将在D:\qt-build\qtbase里生成bin程序,头文件,库文件,接着执行安装部署,将安装到之前设置的-prefix目录。

   mingw32-make install

D:\Qt\Qt5.15.2\mingw1010_64\bin加入到环境变量path中,正如前所述,就可以方便地用qmake去构建其他任何工程以生成makefile,执行编译mingw32-make -j16 ,执行安装mingw32-make install

编译好一个模块后记得安装帮助文档,而不要立马就把编译生成目录给删了,不然再单单通过qmake生成makefile再编译文档是没法生成帮助文档的,因为编译时拷贝了很多源文件,生成文档时会去解析。

  1. 编译qch格式文档:mingw32-make docs
  2. 安装文档:mingw32-make install_docs

官网上的qtdoc-everywhere-src-5.15.2.zip和解压后的源码根目录中的qtdoc目录内容一样。这个其实是用来生成qt的整体介绍型帮助文档的,包括完全独立的html格式的,以及可以导入到Qt Assistant和Qt Creator中的qch格式的。具体操作及注意事项可见其目录中的README。编译这些不仅需要make还需要qdoc工具,qdoc包含在qttools工程中,但是注意,qdoc使用Clang解析C++代码,因此其依赖libclang。而Clang是LLVM Compiler Infrastructure Project中的一部分。所以需要安装LLVM6.0以上版本。

qmake -query 查qt安装目录配置

错误记录

qtmultimedia编译报错,
E:/msys2_x86_64/mingw64/x86_64-w64-mingw32/include/mfidl.h:3245:19: note: forward declaration of ‘IMFSourceResolver’ {aka ‘struct IMFSourceResolver’}
3245 | typedef interface IMFSourceResolver IMFSourceResolver;

执行qmake生成makefile时,使用qmake D:\qt-src515\qtmultimedia -- -no-wmf解决。

如果遇到其他问题,可以参考我前面发的官方文档。

Qt Creator的编译

有了前面的编译经验和认识,其实编译Creator也是相同的。完全可以把它看作是一个Qt写的项目而已。同样可以用qmake编译,但是Qt Creator的编译使用qmake的方式始终失败,最终是用cmake编译成功的。

–END–

敝人所言重在引导,并未细致入微,况且细枝末节,难以言表,还请灵活变通。


myAvatar

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 5.15的源码编译(Windows) 的相关文章

随机推荐

  • Python自定义豆瓣电影种类,排行,点评的爬取与存储(进阶上)

    Python 2 7 IDE Pycharm 5 0 3 Firefox 47 0 1 具体Selenium及PhantomJS请看Python 43 Selenium 43 PIL 43 Tesseract真正自动识别验证码进行一键登录
  • 解决pdfminer ImportError: cannot import name process_pdf

    Python 2 7 IDE Pycharm 5 0 3 pdfminer 20140328 解决问题和测试多个版本读pdf 解决问题 在进行PDF读取的时候 xff0c 遇到pdfminer ImportError cannot impo
  • 2017校招去哪网,阿里,网易,中兴,华为笔试编程题五则(Python描述)

    前言 学长忙着找工作 xff0c 今天几轮笔试 xff0c 把能拍到的笔试题都给我写了写 xff0c 我想对明年找工作或者实习有所帮助 第一题 xff0c 去哪网笔试题 题目我个人感觉难度还可以 xff0c 我自己写了好久 xff0c 三道
  • linux系统特定的头文件

  • 总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)

    前言 此片有很多别人的东西 xff0c 直接搬过来了 xff0c 都有注释 xff0c 里面也有一些自己的理解和需要注意的地方 xff0c 以此记录一下 xff0c 总结如下 xff0c 思想不够成熟 xff0c 以后再补充 xff0c 如
  • Echarts入门(零基础小白教程)

    前言 适合0前端基础的小白 xff0c 什么配置啊 xff0c 不会啊 xff0c 我就想画个图先 xff0c 没问题 xff0c 按照步骤做 xff0c 先来实现第一个图 xff0c 之后官方教程会教会你更多的 下载echarts 小白建
  • 使用python对高光谱数据进行处理和分类

    目的 加载遥感图像的 mat数据进行呈图显示将 mat的数据转化为python后续算法处理的csv文件存储训练模型 xff0c 观察分类效果 xff0c 在图中显示与原图对比 方法 Refer xff1a spectral python官网
  • 性能监控工具nmon介绍

    性能监控工具nmon介绍 做性能测试 xff0c 服务器监控是至关重要的 xff0c 使用nmon命令可以轻松捕捉系统资源的使用情况 xff0c 便于做性能分析 nmon官方介绍 nmon是一种在 AIX 与各种 Linux 操作系统上广泛
  • 使用gitlab中issues做缺陷管理

    使用Gitlab中Issues做缺陷管理 创建issue bug模板 创建issue bug模板是为了在创建issue时可以选择模板 xff0c 控制issue的格式统一 上传bug templates md文件至git库上 gitlab
  • JMeter学习笔记(七):Linux运行JMeter

    JMeter在Linux下运行测试 安装JDK 首先安装JDK xff0c 并正确配置环境变量 下载jdk并上传至linux服务器 上传并解压jdk压缩包jdk 8u231 linux x64 tar gz xff0c 建议把软件都安装到
  • Jenkins配置Windows节点实现自动化测试(一)

    Jenkins配置Windows节点实现自动化测试 一 配置节点 目前公司已经有jenkins服务器 xff0c 且运维人员已经配置好CI CD持续集成持续部署 xff0c 测试人员期望将自动化测试集成到CI CD任务中 xff0c 由于U
  • 使用WinSW安装Windows服务

    使用WinSW安装Windows服务 背景 配置Jenkins Windows节点时 xff0c 需要手动执行命令启动服务 xff0c 每次手动启动很麻烦 xff0c 写成批处理文件放在C ProgramData Microsoft Win
  • VMware中ubuntu虚拟机重启后找不到ens33网卡问题

    VMware中ubuntu虚拟机关闭重启后ens33网卡找不到问题解决方案 工作中会使用ubuntu 桌面版本 xff0c 虚拟机中ubuntu使用完后直接点击关闭 xff0c 重新打开后无法上网 xff0c 查看无ens33网卡 xff0
  • HTTP之TCP三次握手四次挥手

    HTTP概述 HTTP是hypertext transfer protocol xff08 超文本传输协议 xff09 的简写 xff0c 它是TCP IP协议的一个应用层协议 xff0c 用于定义WEB浏览器与WEB服务器之间交换数据的过
  • 深入理解Wi-Fi P2P

    第7章 深入理解Wi Fi P2P 本章所涉及的源代码文件名及位置 W ifiP2pSettings java packages apps Settings src com android settings wifi p2p W ifiP2
  • JMeter遇到全局变量、BeanShell Sampler、JDBC(postgresql)

    全局变量 BeanShell Sampler JDBC postgresql xff09 设置全局变量 场景 xff1a 在压测指定接口时需要先进行登录才能去访问接口 xff0c 解决方案是先设置一个登录线程 xff0c 登录成功后通过JS
  • Python JSON dumps与loads傻傻分不清

    一 JSON基本概念 JSON代表JavaScript对象符号 它是一种轻量级的数据交换格式 xff0c 用于存储和交换数据 它是一种独立于语言的格式 xff0c 非常容易理解 xff0c 因为它本质上是自描述的 python中有一个内置包
  • tomcat 端口冲突问题的解决办法

    方法1 tomcat开机启动了 xff0c 你可以查看任务管理器 xff0c 把tomcat xff08 或者Apache tomcat xff09 的任务关了 方法 2 更改tomcat的8080端口 打开配置文件 xff08 如下 xf
  • 总结之知识图谱前沿技术课程

    前言正文参考文献 前言 写在前面 xff0c 本文的内容主要基于2017年12月2日在苏州大学举办的知识图谱前沿技术课程 xff08 感谢各位老师的talk xff0c 受益良多 xff09 以及本人在之前阅读的有关paper xff0c
  • Qt 5.15的源码编译(Windows)

    前言 xff1a 在技术革新如此之快的时代 xff0c Qt也在为适应这些变化发生着重大的改变 又一长期 3年 支持版Qt 5 15 LTS在2020年3月发布 xff0c 重大更新的大版本Qt 6 0也在2020年12月发布 但是 xff