☰
Qt 5开发环境搭建指南:从源码下载到编译运行避坑
2026/10/12 7:01:05 网站建设 项目流程

简介:这是一套基于QT 5框架的C++项目源码,面向正在学习QT跨平台开发或需要参考完整项目结构的初学者与初级开发者。包体共69个文件、约14.23MB,涵盖8个cpp源文件(如程序入口、主窗口逻辑及多个功能模块)、7个h头文件、UI界面定义文件、工程配置文件(pro)、资源文件(qrc),以及18个wav音效素材和25张png界面图片,另附一份项目报告docx与Git忽略配置,类型搭配完整且分工明确。文件组织清晰,能直接反映QT项目从界面绘制、事件响应到资源打包的典型开发链路。目前已累计有90人学习下载,适合希望在实战中理解QT5信号槽机制、模块划分和跨平台编译配置的读者,通过阅读这份源码还可学习窗口交互设计、音效与图片资源的管理方式,也可直接作为课程设计或小型项目的改造蓝本。

1. "kom的代码是QT5版本"这句话,决定了你下载的方向

拿到一个叫 kom 的开源项目源码包,注释和 README 里都写着"基于 Qt 5 开发",结果装完 Qt 6 打开工程,编译直接飙出几百条红色错误,连QString::asprintf都报找不到重载。这不是个例,而是 Qt 5 和 Qt 6 之间断代升级造成的常见翻车现场。kom 这个项目代码量不小,很多底层调用链都是照着 Qt 5 的 API 习惯写的,直接迁移到 Qt 6 往往不是改几行代码的事。这篇笔记就从 kom 这个具体项目出发,说清楚一件事:既然源码锁定 Qt 5版本,那 Qt 5 开发包到底该从哪下载、装哪些组件、怎么把环境搭到能编译运行,以及这一路上最常见的坑在哪里。适合刚接手 Qt 老项目的开发者,也适合需要在自己机器上复现 kom 运行效果的人。

2. 为什么 kom 锁死 Qt 5:先看清 5 和 6 的差异再决定下哪个

2.1 Qt 5 和 Qt 6 的断代差异,不只是版本号变了

Qt 6 对 Qt 5 的破坏性改动,比当年 Qt 5 对 Qt 4 还要大。最直观的是模块拆分:QtQuick框架重写,QtWidgets和QtWebEngine的模块路径、构建标志都动了。对 kom 这种以桌面窗体为主、掺杂网络请求和多媒体处理的程序来说,最难受的是基础类库的变化。

举个典型的例子,Qt 5 里很多项目把QSslSocket直接链进主程序,依赖 OpenSSL 1.1。Qt 6 默认绑定 OpenSSL 3.x,API 层面虽然大面兼容,但QSslConfiguration::setProtocol的枚举值变了,证书验证的默认行为也不同。再比如QRegExp在 Qt 5 里还能凑合用,Qt 6 直接标记废弃,正则表达式引擎的行为跟旧代码写出完全不同的匹配结果。kom 这种老代码基础上有大量QRegExp调用的可能性很高,所以从源头把环境锁在 Qt 5 反而是最省事的方案。

还有构建链的差异。Qt 5 时代 qmake 还是主角,CMake 处于过渡状态。Qt 6 里 CMake 成为唯一官方构建系统,很多老项目里的.pro文件在 Qt 6 环境里压根不认。但如果 kom 的工程组织方式是.pro加pri模块化拆分,那用 Qt 6 的 CMake 重新组织工程就是一次重构,不是下载能解决的。某种程度讲,源码写"Qt 5版本",就是在替你表态:别折腾升级,直接配 Qt 5 环境。

2.2 拿到 kom 源码后,如何快速判断它到底锁死哪个 Qt 版本

不要只看 README 里写没写,要看工程文件里实际怎么声明。我拿到一个老项目源码,第一件事是打开工程根目录看三处:.pro文件、CMakeLists.txt、还有带版本号命名的依赖目录。

.pro文件里搜索QT +=和greaterThan(QT_MAJOR_VERSION, 5)之类的写法,能看出项目维护者自己用哪个版本编译。CMakeLists.txt 则看find_package(Qt5 REQUIRED COMPONENTS ...)还是find_package(Qt6 ...)开头。找一圈没发现版本写死,再右键看源文件里有没有QT_VERSION_CHECK宏定义。

实操时更快的方法是在源码目录里跑一句 bash 命令,把版本线索一次性捞出来:

grep -rEn "QT_VERSION|QT_MAJOR_VERSION|find_package\(Qt|greaterThan\(QT_MAJOR" \ --include="*.pro" --include="*.pri" --include="*.txt" --include="*.cmake" . | head -30

这段命令把所有与 Qt 版本相关的声明从工程文件里抓出来,-E用扩展正则,head -30防止输出太长。跑完之后你能看到比如QT += core gui widgets network这种模块声明,以及版本判断语句。如果.pro里是QT += core gui widgets multimedia serialport,说明 kom 还依赖多媒体和串口模块,下载 Qt 时就要勾选对应组件,不能装个裸的 Qt 就跑。

2.3 版本选型:Qt 5 的 LTS 分支怎么选

确定了 Qt 5 大版本,还要选小版本。Qt 5 官方有两波长期支持分支:5.12、5.15。5.12 支持期早就结束,5.15 的 LTS 支持延续到 2025 年底。遇到 kom 这种用 Qt 5.15 写的老项目,我一般直接选 5.15.2,这是 5.15 系列里二进制安装包里最稳定、社区口碑最好的一个点版本,也是很多开源项目在 CI 里默认使用的版本。

内存占用方面,5.15.2 的QtWebEngine模块和 Qt 6 相比跑起来更轻,对老机器更友好。如果你的 kom 带界面且不涉及特殊硬件,5.15.2 的稳定性和生态匹配度都是首选。

# 在 Linux 下查看当前 qmake 版本,判断系统里是否已经有 Qt 环境 qmake -v which qmake

第一行输出QMake version 3.1加Using Qt version 5.15.2,那就说明系统里已经存在一个可用的 Qt 5 环境,不必重复下载。第二行告诉你 qmake 所在路径,后续配置 IDE 的 Kit 时会用到。

3. 从官方渠道拿 Qt 5:下载入口、版本清单和组件勾选

3.1 官方下载入口与版本检索方式

Qt 官方下载站的目录结构是按"大版本/小版本/子版本"逐层展开的,进入后找到5.15目录,点进5.15.2就能看到针对不同平台的安装包。注意安装包分两类:在线安装器(几百 KB,运行时按需拉取)和离线安装包(一个多 GB 的完整包)。

对国内网络环境来说,我不建议用在线安装器去装 Qt 5,因为它会把大量的元数据请求发到官方服务器,很多时候卡在"初始化"界面就不动了。离线安装包虽然体积大,但下载完成后安装过程顺畅,装完就能用。下在 5.15 分支时,文件命名带linux-x64、windows-x86_64或者mac字样,按你当前系统的架构选就行。64 位系统就选x86_64,别选成 32 位的x86包。

下载完成后首先要校验文件完整性。官方发布时会带上对应校验值,sha256sum命令是 macOS/Linux 下的习惯操作,Windows 提供certutil -hashfile。多花十秒钟做校验,能避免下载中断导致安装包损坏、安装到一半报错这种坑。

# Linux/macOS 下校验下载好的 Qt 离线安装包 sha256sum qt-opensource-linux-x64-5.15.2.run

3.2 安装器模式与组件勾选:什么样的.run/.exe对应什么样的装法

拿到.run结尾的 Linux 安装包后,需要先给执行权限再运行:

chmod +x qt-opensource-linux-x64-5.15.2.run ./qt-opensource-linux-x64-5.15.2.run

Windows 下直接双击.exe就行。安装过程会要求登录 Qt 账号,这一步卡了很多新人。实际上 Qt 的免费开源版本只需要在安装器里创建一个 Qt 账号并确认开源协议,不需要付费。填完账号密码、勾选协议条款后,真正的关键步骤才到:组件选择界面。

组件选择界面有三个大分组需要分清。第一组是 Qt 5.15.2 本体,下面有MinGW 8.1.0 64-bit、MSVC 2019 64-bit等子项,这是编译 kom 用的工具链。第二组是 Qt Tools,老版本会带Qt Creator集成开发环境、MinGW编译器、CMake、Ninja等。第三组是源码和附加模块,Sources选项可以勾上,调试时方便跟踪进 Qt 内部实现。

对 kom 这个项目,我的建议是勾选以下内容:核心组件里的Qt 5.15.2全选默认子项,额外补上Qt WebEngine和Qt Multimedia,如果 kom 跟硬件交互再勾Qt Serial Port。工具链选 MinGW 而不是 MSVC,因为源码包里的 Makefile 可能没有适配 MSVC 的编译参数,MinGW 兼容性更广。

3.3 安装后的环境验证,决定你后面少受多少罪

装完 Qt 5 后不要急着打开 Qt Creator 就加载项目,先做两个基础验证。

第一步,确认qmake真的指向了刚装好的 Qt 5 路径。如果系统里之前装过 Qt 6,PATH 环境变量会把qmake指到错误位置。在命令行里跑:

qmake -v

如果输出的是 Qt 6 的版本号,说明 PATH 被旧环境劫持了,需要在 Qt 5 的bin目录前插入新路径,比如把/opt/Qt5.15.2/5.15.2/gcc_64/bin放到 PATH 的最前面。Windows 下可以先跑where qmake看解析到了哪个路径。

第二步,编译一个极简的 Qt 控件程序,验证编译器、链接器、运行库三者链路通畅:

#include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("kom env ok"); label.show(); return app.exec(); }

小米条测试文件放在一个空目录里,同目录建一个.pro文件写QT += widgets加上SOURCES = main.cpp两行,然后执行qmake && make。能弹出一个带文字的窗口,说明 Qt 5 环境完全可用;如果报cannot find -lGL这类链接错误,就是系统缺 OpenGL 开发库,sudo apt install libgl1-mesa-dev之类的操作补上再继续。

4. 把 kom 源码用 Qt 5 环境跑起来:qmake 路线和 CMake 路线

4.1 用 qmake 加载 kom 工程的配置流程

拿到 kom 源码首先看根目录有没有.pro文件。有的话,整个编译流程就是用 qmake 生成 Makefile 再 make。在 Qt 5 环境下,qmake 读入.pro里的模块声明、头文件路径、源文件列表,按目标平台生成对应构建文件。

cd kom-source-dir qmake kom.pro -o Makefile make -j4

参数说明里-j4表示用 4 个并行任务编译,如果机器核心多可以加大到-j8。-o Makefile是指定输出文件名,默认输出到当前目录。如果项目里有复杂的子模块引用,qmake 还会生成子目录构建规则,顶层.pro带SUBDIRS配置的话,上述两条命令就会递归执行到所有子模块。

这里有个容易被忽略的点:qmake 生成 Makefile 时会把"使用哪个编译器"这信息写死。执行qmake之前,一定要确认当前命令行里能访问到的g++是 MinGW 提供的那个,而不是系统自带的别的编译器。一个快速验证方案是在源码目录跑:

g++ --version

输出的版本号和Qt 5.15.2安装包自带的 MinGW 版本对上,才能保证编译过程中不会出现标准库头文件冲突。

4.2 CMake 路线:当 kom 用 CMake 组织工程时怎么办

有些 kom 这种老项目虽然用 Qt 5 写,但工程组织方式是 CMake。这种情况下.pro文件可能不存在或者只做辅助,根目录以一个CMakeLists.txt为主。Qt 5 的 CMake 配置跟 Qt 6 的区别在find_package的写法,Qt 5 要指定Qt5前缀,Qt 6 才能写Qt6。

mkdir build && cd build cmake .. -DCMAKE_PREFIX_PATH=/opt/Qt5.15.2/5.15.2/gcc_64 cmake --build . --target kom

CMAKE_PREFIX_PATH指向 Qt 5 的安装前缀目录,CMake 会在该目录下寻找lib/cmake/Qt5里的配置脚本。Windows 下要把路径换成 Qt 5 安装目录里的5.15.2\msvc2019_64或者mingw81_64对应路径。这一步不设的话,CMake 很可能抓到系统里的 Qt 6 配置脚本,导致编译中期冒出莫名其妙的类型错误。

构建命令里的--target kom是只构建 kom 主目标,如果需要编译所有子目标可以去掉这一项。如果cmake ..阶段报了Could not find a package configuration file,说明CMAKE_PREFIX_PATH路径不对,检查 Qt5Config.cmake 文件的实际位置再调整。

4.3 在 Qt Creator 里配置 kom 专用 Kit

命令行编译是验证环境的手段,日常改代码调试我还是建议用 Qt Creator 打开工程。打开 kom 的.pro文件后,Qt Creator 会弹出 Kit Selection 窗口,这时要注意选择与安装时一致的 Qt 5 Kit。

手动添加 Kit 的路径是:菜单Tools->Options->Kits->Qt Versions先添加 Qt 5 的 qmake 路径,再到Compilers添加 MinGW 的 g++,最后在Kits标签页把两者组合成一个新 Kit。操作顺序不能反,因为 Kit 需要同时引用 Qt 版本和编译器,缺一个都会导致 Kit 显示为"无效"。

很多编译报错来自 Kit 没配对。比如用 MSVC 的 Kit 打开为 MinGW 环境下编写的.pro项目,可能触发This version of Qt is not supported之类的提示。实际上不是 Qt 不支持,是.pro文件里写了win32-g++这类平台标志,MSVC 的 Kit 无法识别。这种情况就换 Kit 重新加载,不用改代码。

5. 编译运行期避坑:从"找不到头文件"到"插件加载失败"

5.1 编译报No such file or directory,原因多半是模块没勾全

现象:运行 qmake 和 make 之后,控制台报fatal error: QtMultimedia/QMediaPlayer: No such file or directory或者其他模块头文件缺失。

原因:安装 Qt 5 时组件没选完整,Qt Multimedia模块没有被安装。Qt 5 的离线安装包默认不勾所有模块,很多开发者会漏掉Qt Serial Port、Qt Multimedia这类附加组件。而 kom 的.pro文件里写了QT += multimedia,对应头文件却找不到,编译自然失败。

解决:回到 Qt 安装器重新运行,选择"添加/移除组件",勾选缺失模块,完成后重新打开qmake和make。如果用的是在线安装器且网络不好,也可以直接修改.pro把相关模块临时注释掉来定位代码依赖,但治标不治本,最终还是要补装组件。

5.2 编译全过,运行时弹窗提示could not find or load the Qt platform plugin "windows"

现象:编译成功,生成的可执行文件双击运行,立刻弹窗报错无法加载平台插件,程序直接退出。

原因:Qt 程序运行时需要加载platforms插件目录里的动态库,这个目录默认位于 Qt 安装目录的plugins/platforms。如果你直接把编译产物拷到别的机器上运行,或者系统 PATH 里没有 Qt 的bin目录,Qt 就找不到插件路径。在 Linux 下更容易触发,因为还要检查xcb插件依赖的系统库是否齐全。

解决:把插件路径显式指给程序。在可执行文件旁建一个qt.conf文本文件,内容指定插件目录,或者运行时设置环境变量。qt.conf内容:

[Paths] Plugins = /opt/Qt5.15.2/5.15.2/gcc_64/plugins

这是最常见的运行期坑,很多人编译通过后在这卡一天。要是移动了编译产物,记得把对应平台插件拷贝到目标机器的相同相对位置。

5.3 运行起来后控件一片空白或中文全是方块

现象:kom 的界面加载出来了,但字体全变成方框,或者部分控件内容刷新不出来。

原因:中文字体缺失是 Qt 5 在部分精简 Linux 系统的老问题,系统里没有中文字体包,Qt 的字体会自动回退到无字形状态。控件空白则可能是 OpenGL 渲染问题——Qt 5 的 Widgets 默认走 raster 引擎,但 WebEngine 或某些自绘控件强制启动 OpenGL,显卡驱动不支持就白屏。

解决:安装中文字体包,Linux 下是fonts-wqy-microhei这类字体;白屏则在启动程序前设置export LIBGL_ALWAYS_SOFTWARE=1强制软件渲染。虽然慢一点,但保证画面能出来。需要在代码里处理的话,QApplication之前设置QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL)也有同样效果。

5.4 我明明选了 Qt 5,编译时却带着 Qt 6 的配置

现象:用qmake -v看到的是 Qt 5,但 CMake 或 IDE 的编译输出里出现了 Qt 6 的路径,导致链接一堆类型不匹配。

原因:qmake 和 CMake 是两套独立的环境发现机制。qmake 只能看到 PATH 里的可执行文件,CMake 则搜索CMAKE_PREFIX_PATH。如果系统里装了 Qt 6 并且它的lib/cmake/Qt6目录先被搜到,CMake 就会选 Qt 6 而忽略你在命令行里看到的 Qt 5。

解决:CMake 命令行里显式指定 Qt 5 的路径,不要依赖默认搜索。确认方式是在CMakeLists.txt的find_package之前打印信息,加一行message(STATUS "Qt dir: ${CMAKE_PREFIX_PATH}"),跑一遍cmake ..看实际输出路径。也可以用-DQt5_DIR直接告诉 CMake 到哪个目录找Qt5Config.cmake。

5.5 MinGW 版本不对,编译器直接拒绝编译

现象:安装器里勾选的是MinGW 8.1.0 64-bit,但系统里原本还有一个 MinGW 9 或者 7 的编译器,编译时报错头文件结构不匹配,比如bits/c++config.h找不到。

原因:Qt 5 的官方二进制安装包是针对特定 MinGW 版本预编译的,Qt 的库内部链接了对应版本的标准库符号。如果编译器版本不一致,Qt 的头文件与标准库实现之间的隐含约定会被破坏。尤其是std::string、std::vector这类模板类,不同版本的标准库实现可能存在 ABI 差异。

解决:确保编译 kom 时使用的编译器就是 Qt 5 安装包里自带的那个,不要用系统里的其他版本。手动执行make clean后重新指定编译器路径。Qt Creator 里检查 Kit 的编译器是否与 Qt 版本一致,Linux 下可以用update-alternatives把默认 g++ 指到正确的版本。

5.6 程序启动崩溃,报abort trap或者段错误

现象:程序启动时闪退,终端显示Segmentation fault,严重时直接在 Qt 初始化阶段就崩溃。

原因:这类问题在 Qt 5 老项目中味道很复杂,但最常见的两个:一个是main函数里创建 QApplication 之后又重复创建;另一个是某个插件或库版本与 Qt 版本不一致,程序初始化时调用到未定义的内存段。不少 kom 这类项目源码里带了旧版第三方库,它们可能是按 Qt 5.9 或更早版本编译的,5.15 运行时直接不兼容。

解决:先用ldd检查可执行文件的动态库依赖,看有没有混入可疑路径的 Qt 库。然后在main函数开头加qDebug() << "start";逐行确认崩溃位置,把问题缩小到具体模块。如果确认是第三方库版本太旧,考虑重新编译该库,而不是在 Qt 版本上继续折腾。

6. 把 Qt 5 环境用到顺手:三个值得养成的习惯

第一个习惯是维护多版本 Qt 共存。Qt 5 和 Qt 6 在同一台机器上完全可以并存,前提是不要通过改 PATH 的方式切换版本,而是使用各自的完整路径调用。我给自己的机器设计了一个目录结构,/opt/qt/5.15.2和/opt/qt/6.5.0分开存放,需要哪个版本就在项目的构建脚本里写死哪个路径。这样避免了"编译时还好好的,下次打开就崩"的版本漂移问题。

第二个习惯是掌握qmake的-query命令。这个命令能直接列出当前 qmake 所对应的 Qt 版本、安装路径、插件目录,比各种环境变量排查快得多:

qmake -query

输出里的QT_INSTALL_PREFIX和QT_INSTALL_PLUGINS两个字段,能直接回答"Qt 到底装在哪"以及"运行时去哪找插件"这两个最常遇到的问题。设置环境变量前先跑一下,能省掉不少弯路。

第三个习惯是在项目里保留自己的构建脚本,不依赖 IDE 的构建按钮。特别是 kom 这种锁版本的项目,我写了一个简单的 shell 脚本,用于每次清空构建目录后重新用 qmake 和 make 构建。这样做最大的好处是构建过程可重复、可排查,出问题时能精确复现步骤,而不是在 Qt Creator 的构建输出面板里猜。

说实话,Qt 5 老项目这些年会越来越多地出现在各种历史代码库和升级替换场景里。遇到 kom 这种明确标注"Qt 5版本"的代码,与其硬着头皮往 Qt 6 迁移,不如先把正确版本的开发环境装好、把编译运行跑通。掌握 Qt 5 环境的下载、配置和调试手段,后面无论接手多少个类似的老项目,都不会再被下载装环境这件事卡住半天。希望这些实际操作经验,能帮你在解决 Qt 版本问题时少走一些弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询