最近在Windows平台上同时安装了Visual Studio 2015和Visual Studio 2019(或更高版本)的开发环境后,使用QT Creator创建新项目时,如果选择默认的MSVC2015编译器进行编译,会遇到一个典型的报错:
code复制D:\Windows Kits\10\Include\10.0.26100.0\ucrt\wchar.h:313: error: C3861: "_mm_loadu_si64": 找不到标识符
这个错误的核心原因是Windows SDK版本冲突。当系统中安装了多个Visual Studio版本时,高版本的Windows SDK(如10.0.26100.0)会覆盖低版本的SDK文件。而MSVC2015编译器需要特定版本的Windows SDK支持,当它尝试使用高版本SDK中的头文件时,就会出现兼容性问题。
关键点:_mm_loadu_si64是SSE2指令集的一个内联函数,在高版本SDK中被引入,但MSVC2015的编译器并不支持这个特性。
在QT Creator中克隆MSVC2015编译器并修改配置的核心目的是创建一个独立的环境,避免与系统默认的SDK路径冲突。通过这种方式,我们可以:
Windows Kits目录结构通常如下:
code复制Windows Kits
└── 10
├── Include
│ ├── 10.0.10150.0
│ ├── 10.0.19041.0
│ └── 10.0.26100.0
└── Lib
├── 10.0.10150.0
├── 10.0.19041.0
└── 10.0.26100.0
当多个Visual Studio版本共存时,安装程序会自动更新Windows Kits到最新版本,但旧版本的文件通常会被保留。我们的解决方案就是利用这些保留的旧版本文件。
首先需要确认系统中已安装的Windows SDK版本。打开命令提示符,执行:
bash复制dir /b "C:\Program Files (x86)\Windows Kits\10\Include"
这会列出所有已安装的SDK版本号。我们需要记下一个与MSVC2015兼容的较低版本(如10.0.10150.0)。
在克隆的编译器配置中,需要修改以下环境变量:
| 变量名 | 原始值 | 修改为 |
|---|---|---|
| INCLUDE | 包含高版本路径 | 替换为低版本路径(如C:\Program Files (x86)\Windows Kits\10\Include\10.0.10150.0) |
| LIB | 包含高版本路径 | 替换为低版本路径(如C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10150.0) |
| UCRTVersion | 10.0.26100.0 | 10.0.10150.0 |
具体操作步骤:
完成上述配置后,执行以下验证步骤:
如果配置正确,原来的"_mm_loadu_si64"错误应该已经消失。可以通过以下命令验证编译器实际使用的SDK版本:
bash复制cl /Bv main.cpp
在输出中检查"INCLUDE"和"LIB"环境变量的值,确认它们指向正确的低版本SDK路径。
如果系统中没有保留低版本SDK,可以:
可能原因及解决方案:
当团队中多人协作时,建议:
这个兼容性问题源于Microsoft的SDK版本策略。高版本SDK中引入了新的SIMD内在函数(如_mm_loadu_si64),这些函数:
MSVC2015的编译器无法识别这些新引入的函数,导致"找不到标识符"错误。
除了本文介绍的方法,还有其他几种解决方案:
| 方法 | 优点 | 缺点 |
|---|---|---|
| 卸载高版本SDK | 简单直接 | 可能影响其他项目 |
| 升级到MSVC2019 | 一劳永逸 | 需要修改代码适配新编译器 |
| 修改项目代码 | 不依赖环境 | 工作量大,维护困难 |
| 本文方法 | 精准控制,不影响其他项目 | 需要手动配置 |
使用旧版本SDK需要注意:
建议的平衡方案:
对于需要频繁配置的环境,可以创建批处理脚本自动设置:
batch复制@echo off
set QT_DIR=C:\Qt
set MSVC_VER=14.0
set WINSDK_VER=10.0.10150.0
set INCLUDE=%ProgramFiles(x86)%\Windows Kits\10\Include\%WINSDK_VER%\ucrt;%INCLUDE%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib\%WINSDK_VER%\ucrt\x86;%LIB%
set PATH=%QT_DIR%\Tools\mingw730_32\bin;%PATH%
start qtcreator.exe
这个脚本可以:
为了避免类似问题,建议:
qmake复制win32 {
WINSDK_VERSION = 10.0.10150.0
INCLUDEPATH += $$(ProgramFiles)/Windows Kits/10/Include/$${WINSDK_VERSION}/ucrt
LIBS += -L$$(ProgramFiles)/Windows Kits/10/Lib/$${WINSDK_VERSION}/ucrt/x86
}
使用相对路径而非绝对路径引用SDK
在版本控制中包含本地开发环境配置
这个案例反映了现代C++开发中的一个普遍问题:工具链的复杂性和版本冲突。更先进的解决方案包括:
这些方法虽然学习曲线较陡,但能从根本上解决环境一致性问题。