Qt项目静态链接第三方库后出现qtmain.lib LNK2038错误求助
解决Qt项目使用/MT编译时qtmain.lib的LNK2038错误
你遇到的这个问题本质是运行时库不匹配导致的——你的项目已经切换到/MT(静态多线程Release)编译模式,但Qt默认提供的qtmain.lib是用/MD(动态多线程Release)编译的,两者链接时就会触发LNK2038错误。下面给你两个可行的解决方案:
方案一:编译支持/MT的Qt源码版本
这是最彻底的解决方式,让Qt库和你的项目完全使用相同的运行时库:
- 下载对应Qt版本的源码包(要和你当前使用的Qt版本一致)
- 打开MSVC2017 x64的命令提示符,进入Qt源码根目录
- 执行配置命令(替换
<你的安装路径>为你想安装编译后Qt的路径):
其中configure -prefix <你的安装路径> -platform win32-msvc2017 -release -static -static-runtime-static-runtime参数就是告诉Qt用/MT模式编译 - 依次执行
nmake和nmake install完成编译安装 - 切换Qt Creator到这个自定义编译的Qt版本,重新构建你的项目,此时
qtmain.lib会和你的项目运行时库一致,错误即可解决。
方案二:绕过qtmain.lib,自定义程序入口
如果你不想重新编译Qt,可以直接跳过Qt提供的qtmain.lib,自己实现程序入口:
- 在你的Qt项目
.pro文件中添加配置,移除对qtmain.lib的默认链接:QMAKE_LFLAGS_RELEASE -= /DEFAULTLIB:qtmain.lib - 然后在你的代码中手动实现
main函数(Qt会自动处理WinMain的逻辑):
这样项目就不再依赖#include <QApplication> // 替换成你自己的主窗口类 #include "MainWindow.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow w; w.show(); return app.exec(); }qtmain.lib,自然也就不会有运行时库不匹配的问题了。
额外注意事项
- 一定要确保你的第三方静态库也是用
/MT Release模式编译的,不然还会出现其他LNK2038错误 - 如果选择方案一,编译Qt源码可能需要半小时以上,要确保你的开发环境安装了MSVC2017的完整组件,以及Python、Perl等Qt编译依赖工具
内容的提问来源于stack exchange,提问作者user8546700
相关产品推荐
相关产品推荐

