如果你的代码使用了 Visual C++ 运行时库(如 msvcp140.dll、vcruntime140.dll、ucrtbase.dll 等),而目标工控机(工业控制计算机)上没有安装对应的运行时环境,那么你的程序在工控机上将无法启动,通常会弹出类似以下错误:
❌ “无法启动此程序,因为计算机中丢失 VCRUNTIME140.dll。”
❌ “由于找不到 MSVCP140.dll,无法继续执行代码。”
✅ 解决方案(按推荐顺序)
✅ 方案一:【推荐】在工控机上安装官方 Visual C++ Redistributable
这是最标准、最安全、最可靠的方式。
步骤:
- 根据你的编译器版本下载对应 Redistributable:
你用的是 Qt 5.12.9 + MSVC2017 → 对应 Visual C++ 2015–2019 Redistributable - 下载地址(微软官方):
x64 版本(64位系统):
https://aka.ms/vs/17/release/vc_redist.x64.exe
x86 版本(32位程序或系统):
https://aka.ms/vs/17/release/vc_redist.x86.exe - 将安装包拷贝到工控机,以管理员身份运行并安装
- 重启(通常不需要,但建议)
✅ 优点:系统级安装,所有程序共享,自动更新,无兼容问题
⚠️ 注意:工控机可能无网络,需提前下载好离线安装包
✅ 方案二:【次选】将所需 DLL 随程序一起部署(“私有部署”)
如果无法安装 Redistributable(如权限受限、系统锁定),可将运行时 DLL 放在你的 .exe 同目录下。
需要复制的文件(MSVC2017 / v141 工具集):
your_app.exe
├── msvcp140.dll
├── vcruntime140.dll
├── vcruntime140_1.dll (如果用了 C++17/20 新特性)
├── ucrtbase.dll (Universal CRT)
└── concrt140.dll (如果用了并发运行时,如 ppl.h)
如何获取这些 DLL?
路径通常在:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Redist\MSVC<版本号>\x64\
或
C:\Windows\System32\ (但不建议直接从这里拷,可能版本不对)
⚠️ 重要法律与技术限制:
微软允许你随应用程序分发 Redistributable DLL,但必须来自官方 Redist 目录(不能从 System32 拷贝!)
必须遵守 Microsoft Visual C++ 分发许可
ucrtbase.dll 属于 Universal CRT,Windows 10 自带;但在 Windows 7/8 上需额外安装 KB2999226 更新或通过 Redist 安装
推荐做法:
使用 Qt 的 windeployqt 工具,它会自动复制 Qt 依赖,但不会复制 VC++ 运行时。你需要手动补充。
❌ 不推荐的做法:
直接从开发机 System32 拷贝 DLL 到工控机 → 可能版本不匹配、缺少依赖、违反许可
修改程序为静态链接(见下文)→ 有局限性
✅ 方案三:【高级】改用静态链接(/MT)
在编译时将 C/C++ 运行时静态链接进你的 .exe,这样就不依赖外部 DLL。
如何设置(Qt + MSVC):
在 .pro 文件中添加:
qmake
QMAKE_CXXFLAGS_RELEASE += /MT QMAKE_CXXFLAGS_DEBUG += /MTd/MT:Release 静态链接多线程运行时
/MTd:Debug 静态链接(仅用于调试)
优点:
无需任何 VC++ Redistributable
程序完全独立
缺点:
EXE 体积增大(+1~2MB)
无法接收微软对运行时的安全更新
如果你的程序是 DLL 插件,且主程序用动态链接(/MD),会导致冲突(混合模式问题)
Qt 官方预编译库是 /MD 动态链接 的,你若用 /MT 静态链接,必须自己重新编译整个 Qt
🚫 因此:除非你完全控制整个软件栈,否则不建议对 Qt 程序使用 /MT
🔧 工控机部署检查清单
💡 强烈建议:即使工控机封闭,也尽量说服客户允许安装官方 Redistributable —— 这是微软支持的标准做法,长期维护成本最低。