2. 开发环境搭建
Qt 工业组态软件的开发,本质上是在与“编译工具链、构建系统、运行库依赖”这三座大山打交道。对于工业现场而言,一个稳定、可复现、可维护的开发环境,往往比追求最新版本特性更为重要。本章将围绕 Qt Creator 的安装策略、MinGW 与 MSVC 两大编译器体系的选型逻辑、以及 Qt 项目工程的底层结构展开,帮助你从“能跑代码”进阶到“懂工程构建”,为后续的图元编辑与 SCADA 通信开发打下坚实基础。
2.1 Qt Creator 安装与版本选型策略
Qt Creator 本身是一个轻量级 IDE,真正决定程序能否运行的是其背后的 Qt 库与编译器。在工业组态场景中,我们通常选择 Qt 5.15 LTS 或 Qt 6.5 LTS 版本。Qt 5.15 是最后一个支持 Win7 的长期支持版本,对于老旧工控机(如研华、研祥的嵌入式整机)兼容性极佳;Qt 6.5 则更适合新项目,其图形渲染性能与 C++17 支持更完善。
安装时建议勾选以下组件:Qt Creator IDE、对应版本的 MinGW 或 MSVC 编译器、Qt Charts(用于趋势曲线)、Qt Serial Port(用于串口通信)、Qt Network(用于 TCP/UDP 通信)。不要贪多安装全部模块,工业组态软件通常只需要 Widgets、Network、SerialPort、Sql 这几个核心模块。
C:\Qt\Qt5.15.2 或 D:\Qt\Qt6.5.3。工业现场经常需要拷贝工程到不同电脑编译,统一路径可以避免因路径差异导致的构建失败。
2.2 MinGW 与 MSVC 编译器选型对比
这是 Qt 开发中最容易困惑的决策点。MinGW 是 GCC 在 Windows 上的移植版,MSVC 是微软官方编译器。两者生成的二进制文件不兼容,即用 MinGW 编译的 .dll 不能链接到 MSVC 编译的 .exe 中。
| 对比维度 | MinGW (GCC) | MSVC (Visual C++) |
|---|---|---|
| 许可证 | 开源,GPL/LGPL | 闭源,需 Visual Studio 授权 |
| 运行时依赖 | libgcc_s_seh-1.dll、libstdc++-6.dll | vcruntime140.dll、msvcp140.dll |
| 调试体验 | GDB,支持断点/变量监视 | VS Debugger,支持内存窗口/反汇编 |
| 第三方库兼容 | 需自行编译或找 MinGW 版 | 绝大多数商业库提供 MSVC 版 |
| 工业场景推荐 | 中小型项目、快速原型 | 大型项目、需要集成第三方 SDK |
判断方法:如果项目需要调用西门子、罗克韦尔等 PLC 厂商的官方 SDK(通常只提供 MSVC 版),则必须选择 MSVC。如果项目完全基于 Qt 生态,且需要部署到无 VC 运行库的嵌入式 Windows 系统,MinGW 更合适。
undefined reference 或 LNK2038 错误。在 Qt Creator 中,每个 Kit(工具链)必须绑定唯一的编译器。
2.3 项目创建与 Kit 选择实战
打开 Qt Creator,点击“新建项目”,选择“Application → Qt Widgets Application”。在 Kit 选择页面,你会看到多个预设的 Kit,例如 Qt 5.15.2 MinGW 64-bit 和 Qt 5.15.2 MSVC2019 64bit。这里需要根据 2.2 节的决策选择其一。
创建完成后,工程目录结构如下:
MySCADA/
├── MySCADA.pro # qmake 工程文件(构建规则)
├── main.cpp # 程序入口
├── mainwindow.cpp # 主窗口实现
├── mainwindow.h # 主窗口头文件
├── mainwindow.ui # 界面布局文件(XML)
└── resources.qrc # 资源文件(图标、图片、字体)
核心原理:.pro 文件是 qmake 的构建脚本,它定义了源文件、头文件、库依赖和编译选项。例如:
QT += core gui network serialport charts
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MySCADA
TEMPLATE = app
SOURCES += main.cpp mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
LIBS += -lws2_32 # 链接 Winsock 库(用于网络通信)
在工业组态项目中,我们通常还会添加 CONFIG += static 来启用静态编译,但这需要 Qt 静态库支持,后续章节会详细讲解。
2.4 工程结构深度解析与构建排障
理解 Qt 工程结构的关键在于区分构建产物与源文件。Qt Creator 默认使用“影子构建”(Shadow Build),即编译生成的中间文件(.o、.obj、moc_*.cpp)存放在独立的构建目录中,不污染源码目录。这在工业项目中非常重要,因为现场工程师经常需要打包源码,干净的源码目录便于版本管理。
构建过程中,Qt 的元对象编译器(MOC)会处理包含 Q_OBJECT 宏的头文件,生成 moc_*.cpp 文件。如果出现 Unknown module(s) in QT: serialport 错误,说明 .pro 文件中缺少 QT += serialport,或者安装 Qt 时未勾选 Serial Port 模块。
0xc000007b 错误。分析过程:该错误通常由架构不匹配或缺少运行库导致。检查发现目标机为 32 位系统,而编译产物为 64 位。解决步骤:① 在 Qt Creator 中新增 Kit,选择 Qt 6.2.0 MinGW 32-bit;② 重新编译整个项目;③ 使用 windeployqt 工具自动拷贝依赖库;④ 在目标机安装 VC Redist 2019 x86(若使用 MSVC)。最终程序正常运行。复盘经验:工业现场老旧设备众多,开发前必须确认目标系统的架构(x86/x64)和版本(Win7/Win10),并在 .pro 文件中通过 contains(QT_ARCH, i386) 做条件编译。
另一个常见误区是盲目使用最新版 Qt。Qt 6 移除了部分 Qt 5 的模块(如 Qt Script),且 QML 与 Widgets 的集成方式有变化。对于 SCADA 这类以数据监控和传统控件为主的软件,Qt 5.15 LTS + MinGW 64-bit 是目前工业界最稳妥的组合。它兼顾了稳定性、性能与部署便利性。
最后,建议在工程中统一使用 #pragma execution_character_set("utf-8")(MSVC)或 /utf-8 编译选项,避免中文乱码问题。在 .pro 文件中可以这样配置:
msvc {
QMAKE_CXXFLAGS += /utf-8
}
mingw {
QMAKE_CXXFLAGS += -finput-charset=UTF-8 -fexec-charset=UTF-8
}
通过以上配置,可以确保源码中的中文字符串在编译后正确显示,避免在组态软件界面中出现乱码。
BUILD.md 文档,记录 Qt 版本、编译器版本、依赖库列表、部署步骤。工业组态软件的生命周期通常长达 5-10 年,一份清晰的环境文档能大幅降低后期维护成本。