解决qt5.9.4和2015配置xilinx上位机报错问题

解决 Qt 5.9.4 MSVC 版本的头文件冲突问题

核心原则是保持 MSVC CRT 头文件的优先级,避免强制替换为 Windows Kits 的 stdlib.h,否则会导致宏缺失或调用约定错误(如 __cdecl)。以下是具体解决方案:

确保 INCLUDEPATH 顺序正确

Qt 工程可以保留 Windows Kits 的路径,但必须确保 MSVC CRT 头文件路径在前,Windows Kits 路径在后。这样既能使用 MSVC 的 CRT 头文件,又能兼容 UCRT。

推荐 .pro 配置

在 Qt 项目的 .pro 文件中添加以下路径,确保 MSVC CRT 优先:

qmake 复制代码
# MSVC 自带 CRT 优先
INCLUDEPATH = $$[QT_INSTALL_PREFIX]/msvc2015_64/include \
              "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include" \
              "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/ucrt" \
              "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/shared" \
              "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/um"

检查宏污染

确认项目中没有错误定义以下宏,否则可能导致编译冲突:

cpp 复制代码
#define __cdecl
#define WINAPI
#define FAR

如果存在这些宏,需删除或使用 #undef 取消定义。

验证工具链

确保 Qt Creator 的 Kit 配置正确:

  • 选择 Qt 5.9.4 msvc2015_64
  • 使用 MSVC2015 x64 编译器

在命令行执行以下命令,检查 stdlib.hwinnt.h 的来源:

bat 复制代码
cl /showIncludes main.cpp

确保 stdlib.h 来自 MSVC CRT 路径,而 winnt.h 来自 Windows Kits 的 ucrtsharedum 目录。

常见问题与解决方案

问题 解决方案
__cdecl 未识别 不要使用 Windows Kits 的 stdlib.h,保持 MSVC CRT 头文件优先
winnt.h 报错 确保 INCLUDEPATH 顺序为 ucrtsharedum
Qt 5.9.0 正常,5.9.4 出错 Qt 5.9.4 强制使用 Windows 10 SDK,需严格检查宏和调用约定

结论

使用 Qt 官方配置的 MSVC CRT + Windows Kits,避免手动替换 stdlib.h,即可解决编译错误。