前言:在技术革新如此之快的时代,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
所需依赖-总结
- msys2
如你所见,Qt项目依赖了跟多其他开源项目,如果单纯地使用mingw64编译,会因为缺少很多其他开源库,而无法进行编译。msys2是个很优秀的项目。它将linux下的很多工具和库移植到了windows上,并提供一套类linux的shell环境和完善的编译工具链,方便开发者编译,安装,运行原生windows软件。通过使用msys2的Arch Linux包管理工具pacman,可以很方便自由地安装我们需要的库。 下载 - openGL ANGLE
Qt Quick 2 需要 OpenGL 2.1(或者更高版本) 或者OpenGL ES 2.0 才能工作。
在Windows上, 有两种办法:- 使用 ANGLE 来将OpenGL调用映射为 DirectX (默认)
- 使用Windows系统上显卡厂商提供的原生OpenGL 驱动
Qt 5中已经集成了一份ANGLE。如果要使用方法1,对于mingw编译,你需要安装 DirectX SDK。
如果要使用方法2,你需要确保你的显卡驱动支持OpenGL 2.1 或者更高版本 (注意:微软官方的Windows驱动仅支持OpenGL 1.1,这显然是不够的),然后在使用configure时加上参数’-opengl desktop’。暂时使用-opengl desktop ,angle待以后有时间再研究安装。
- 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快速安装。 - openSSL
Qt使用openSSL以支持SSL网络通信。openSSL可以通过msys2快速安装。 - Python 3 以上(编译Qml需要)
- 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再编译文档是没法生成帮助文档的,因为编译时拷贝了很多源文件,生成文档时会去解析。
- 编译qch格式文档:
mingw32-make docs
- 安装文档:
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–
敝人所言重在引导,并未细致入微,况且细枝末节,难以言表,还请灵活变通。