1. 项目背景
-
环境:Qt 5.12.12 + MSVC 2017 64-bit
-
依赖:CUDA 11.6, Python 3.8, Qwt, FFTW
-
目标:解决编译链接错误(LNK)以及运行时的"无法定位程序输入点"问题。
2. 核心故障现象与解决方案
根本原因分析(Root Cause)
通过排查系统的环境变量(PATH) ,发现了致命问题:
在系统的 PATH 中,同时存在以下路径:
-
D:\Qt\Qt5.12.12\5.12.12\msvc2017_64\bin (微软 VC++ 编译器路径)
-
D:\Qt\Qt5.12.12\Tools\mingw730_64\bin (开源 MinGW/GCC 编译器路径)
-
D:\Qt\Qt5.12.12\5.12.12\mingw73_64\bin (开源 MinGW/GCC 编译器路径)
为什么这会导致连环崩溃?
-
Name Mangling(名字粉碎)冲突: C++ 为了支持函数重载,在编译时会把函数名"粉碎"成一串奇怪的字符(如 ?closestPoint@...)。MSVC 和 MinGW 名字粉碎的规则是完全不同的!
-
环境变量污染: 之前工程里自带的旧 qwt.dll 和 qwt.lib,极大概率是用 MinGW 编译出来的。而我们当前主工程配置的是 MSVC2017_64 套件。
-
LNK2001 报错真相: 当主程序用 MSVC 编译时,链接器试图去找 MSVC 格式的函数签名,但由于环境变量的干扰或者旧 .lib 的污染,它抓取到了 MinGW 格式的库,两者"语言不通",直接爆出 LNK2001 无法解析的外部符号。
-
"点三角能跑"的真相: Qt Creator 内部有严格的环境隔离机制,点击"绿色运行"时,它屏蔽了外部乱七八糟的环境变量,强制走了 MSVC 的路径,所以一切正常。双击 .exe 或手动构建时,系统则顺着 PATH 把错误的 MinGW 库加载了进来。
故障 A:运行时"无法定位程序输入点"


错误日志:
无法定位程序输入点 ?closestPoint@QwtPlotCurve... 于动态链接库 qwt.dll 上
无法定位程序输入点 ?qt_metacall@QDialog... 于 ArthmeticToolDemo.exe 上
产生原因:
这是最典型的 "DLL 版本不匹配"。
- 环境污染:系统 Path 变量中存在 MinGW 或其他版本的 Qt 路径,导致程序启动时"指鹿为马"。

- 混合加载 :
qwt.dll加载了错误的Qt5Svg.dll;.exe加载了错误的Qt5Widgets.dll。
解决方案:
第一步:在"系统变量"里找到 Path
-
在截图下方的 系统变量(S) 列表中,用鼠标滚轮向下滚动,直到看到变量名为 Path 的那一行。
-
选中 Path 这一行,点击下方的 编辑(I)... 按钮。
第二步:删除错误的 MinGW 路径
弹出的新窗口里会列出一长串路径(就是你刚才在命令行看到的那些):
-
在列表里找
D:\Qt\Qt5.12.12\5.12.12\mingw73_64\bin。 -
选中它,点击右侧的 删除。
-
同理,如果有
D:\Qt\Qt5.12.12\Tools\mingw730_64\bin,也把它 删除。
第三步:添加并置顶正确的 MSVC 路径
这是让你的程序不再报"无法定位输入点"的核心操作:
-
点击右侧的 新建。
-
输入(或粘贴):
D:\Qt\Qt5.12.12\5.12.12\msvc2017_64\bin -
选中你刚填好的这一行,连续点击右侧的 上移 按钮,直到它排在 最顶端(第 1 行)。
-
非常重要 :点击当前窗口的 确定。
-
返回上一个窗口(你截图的这个),点击最下方的 确定。
-
再点最后一个 确定。
第四步:清理并验证
-
重启电脑(最稳妥的方法,刷新所有环境变量缓存)。
-
彻底清空
D:\python\build-ArthmeticToolDemo...-Release\release\文件夹里所有的.dll文件。 -
重新打开 Qt Creator,点击 执行 qmake ,然后点击 构建 (小锤子)。
-
现在尝试双击运行生成的
.exe。
为什么之前找不到?
因为 Windows 的环境变量窗口很小,那一长串路径被缩写了。你刚才在命令行看到的 mingw 路径其实就是系统在执行任务时,按照 Path 里的顺序一个个去翻文件夹。之前的顺序里 mingw 排在前面,所以它翻错了文件夹,拿错了"假零件"。
只要按照上面的步骤,把 msvc2017_64\bin 挪到 Path 列表的第一行,报错百分之百会解决!
3. 终极部署清单 (Release 文件夹必备)
双击 EXE 能跑通的必要条件是文件夹里集齐以下"正版"零件:
| 分类 | 文件名 | 来源路径 |
|---|---|---|
| Qt 核心 | Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll |
Qt/5.12.12/msvc2017_64/bin |
| Qwt 必需 | qwt.dll, Qt5Svg.dll , Qt5Xml.dll |
前者来自 Qwt 库,后两者来自 Qt bin |
| 外部依赖 | python38.dll, libfftw3-3.dll |
对应的安装或项目库目录 |
| 插件文件夹 | platforms/, iconengines/, imageformats/ |
Qt/5.12.12/msvc2017_64/plugins |
4. 备忘心得:为什么"点三角"能跑,双击不行?
结论 :Qt Creator 是一个"温室",它在启动程序前会自动在内存里把 msvc2017_64/bin 加到 Path 最前面。
教训 :双击运行是脱离温室的实战。如果环境变量里有"杂质"(如 MinGW、Anaconda),Windows 就会根据 Path 顺序随机抓取第一个看到的 DLL。版本一致、路径置顶是解决此类问题的万能钥匙。
结语 :遇到
?xxxx@xxxx这种乱码式的报错,永远先检查 Path 优先级 和 DLL 来源 。不要手动去乱拷 DLL,尽量使用windeployqt配合手动补齐编外库。
"一键洗白"你的 Release 文件夹
现在你的 release 文件夹里肯定塞满了之前拷错的、乱七八糟的 MinGW 版 DLL。请务必按以下顺序操作:
-
清空 DLL :进入
D:\python\build-ArthmeticToolDemo...-Release\release\,删掉里面所有的 .dll 文件。 -
重新运行命令 :打开一个新的 CMD 窗口(确保
path命令能搜到msvc2017_64),执行:DOS
"D:\Qt\Qt5.12.12\5.12.12\msvc2017_64\bin\windeployqt.exe" --release --force "D:\python\build-ArthmeticToolDemo-Desktop_Qt_5_12_12_MSVC2017_64bit-Release\release\ArthmeticToolDemo.exe" -
手动补漏:
-
把
qwt.dll(来自 QwtPlot\lib) 拷进去。 -
把
python38.dll拷进去。 -
把
libfftw3-3.dll拷进去。
-