You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何构建无需依赖VC Redistributables的Qt C++ Windows应用?解决VCRUNTIME140.dll缺失错误

解决Qt C++ Windows应用无需VC Redistributables运行的问题

我之前也碰到过一模一样的问题,弹出VCRUNTIME140.dll缺失本质是因为你的应用默认动态链接了Visual C++运行时库,用户机器上没装VC Redist就会报错。下面给你几个靠谱的解决办法,按优先级排序:

1. 静态链接VC运行时库(最推荐)

这是最直接的方式,把VC运行时的代码直接编译进你的exe里,完全消除对外部VC DLL的依赖。

针对Qt Creator + .pro项目

在你的.pro文件里添加对应编译参数,区分Debug和Release版本:

# Release版本:静态链接多线程VC运行时
CONFIG(release, debug|release): QMAKE_CXXFLAGS += /MT
CONFIG(release, debug|release): QMAKE_LFLAGS += /NODEFAULTLIB:MSVCRT

# Debug版本:静态链接多线程调试VC运行时(仅用于开发,不要发布Debug版本)
CONFIG(debug, debug|release): QMAKE_CXXFLAGS += /MTd
CONFIG(debug, debug|release): QMAKE_LFLAGS += /NODEFAULTLIB:MSVCRTD

添加后重新qmake、编译即可。

针对Visual Studio项目

如果是用VS打开的Qt项目,右键项目 -> 属性:

  • 转到C/C++ -> 代码生成
  • 运行库选项改成:
    • Release模式:多线程(/MT)
    • Debug模式:多线程调试(/MTd)
  • 应用设置后重新编译。

⚠️ 注意:Debug版本的/MTd不能用于正式发布,微软禁止分发调试版的VC运行时组件,只用于本地调试。

2. 静态构建Qt库(彻底单文件)

如果想连Qt的库也一起静态编译进exe,生成真正的单文件应用,可以自己静态构建Qt:

  1. 下载Qt的源码包(和你当前用的版本一致)
  2. 打开VS的开发者命令提示符(对应你用的MSVC版本,比如x64 Native Tools Command Prompt)
  3. 进入Qt源码目录,执行configure命令:
configure -static -release -prefix "D:\Qt\Static\5.15.2" -opensource -confirm-license -skip qtwebengine -skip qtwebview

-prefix是指定静态Qt的安装路径,-skip可以跳过不需要的模块减少编译时间)
4. 执行nmakenmake install完成编译安装
5. 在Qt Creator里添加这个静态构建的Qt版本,然后切换到该版本编译你的项目。

⚠️ 注意:如果你的项目用了Qt的LGPL协议,静态链接Qt后需要遵守LGPL条款(比如公开你的应用源码,或者提供让用户重新链接Qt的方式),如果是商业许可证则无此限制。

3. 手动打包VC运行时DLL到程序目录(备选)

如果不想静态链接,也可以把依赖的VC DLL复制到你的exe同目录里:

  1. 找到你VS安装目录下的VC Redist文件,比如VS2022的路径:
    C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.38.33130\x64\Microsoft.VC143.CRT
    
    (x64对应64位应用,x86对应32位,版本号根据你的VS版本调整)
  2. 复制该目录下的vcruntime140.dllvcruntime140_1.dllmsvcp140.dll(可能还有其他如msvcp140_1.dll等,按需复制)到你的exe所在文件夹。
  3. 再配合windeployqt工具打包Qt的依赖库:
    windeployqt --release your_app.exe
    
    这样用户运行exe时就能找到所有依赖了。

额外注意事项

  • 如果你用到了第三方库(比如OpenCV、SQLite等),要确保这些库也是用/MT(静态VC运行时)编译的,不然还是会带出动态VC依赖。
  • 静态链接后exe体积会变大,这是正常现象,因为把运行时代码都打包进去了。

内容的提问来源于stack exchange,提问作者FouLiNuX

火山引擎 最新活动