Qt 5.15的源码编译(Windows)

前言:在技术革新如此之快的时代,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

  • 3
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译 OCI 插件需要使用 Qt 的 Sql 模块,而 Sql 模块需要依赖于 OCI 的头文件和库文件。因此,在编译之前,需要先安装 Oracle 客户端和 Qt 的 Sql 模块。 以下是在 Windows 平台上编译 OCI 插件的步骤: 1. 安装 Oracle 客户端 首先,需要从 Oracle 官方网站上下载并安装 Oracle 客户端。按照安装向导的提示进行安装,选择需要安装的组件,如 SQL*Plus、Oracle ODBC 驱动程序等。安装完成后,将 Oracle 客户端的 bin 目录添加到系统环境变量 PATH 中。 2. 安装 Qt 下载并安装 Qt 5.15,选择对应平台的安装包进行安装。 3. 安装 Qt 的 Sql 模块 在 Qt 的安装目录下,找到 Qt 的 Sql 模块,例如:Qt\5.15\mingw81_64\plugins\sqldrivers。将其中的 qoci.dll 复制到程序运行目录下的 platforms 目录中。 4. 编写 pro 文件 在项目的 pro 文件中,添加以下内容: ``` QT += sql INCLUDEPATH += <Oracle 客户端的 include 目录> LIBS += -L<Oracle 客户端的 lib 目录> -l oci ``` 其中,`<Oracle 客户端的 include 目录>` 和 `<Oracle 客户端的 lib 目录>` 需要替换为实际的路径。 5. 编译项目 使用 Qt Creator 打开项目,选择对应的编译器进行编译。 注意事项: - 在编译过程中,需要将 Oracle 客户端的 bin 目录添加到系统环境变量 PATH 中,以便编译器能够找到 oci.dll。 - 在运行程序时,需要将 Oracle 客户端的 bin 目录添加到系统环境变量 PATH 中,以便程序能够找到 oci.dll 和 tnsnames.ora 等文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值