【"_mm_loadu_si64": 找不到标识符】+【LNK1158: 无法运行 "rc.exe"】解决方案
- 一、问题描述
- [二、 解决方案](#二、 解决方案)
-
- [步骤1:修改.pro文件(强制锁定旧 SDK 路径,覆盖系统默认)](#步骤1:修改.pro文件(强制锁定旧 SDK 路径,覆盖系统默认))
- [步骤2:彻底清除系统 SDK 的环境变量干扰](#步骤2:彻底清除系统 SDK 的环境变量干扰)
- [步骤 3:重建项目(确保无缓存残留)](#步骤 3:重建项目(确保无缓存残留))
- [步骤4:指定资源编译器rc.exe-【LNK1158: 无法运行 "rc.exe"】](#步骤4:指定资源编译器rc.exe-【LNK1158: 无法运行 "rc.exe"】)
- 三、关键原理说明
一、问题描述
目前问题的核心是项目在读取系统默认的新版 SDK 路径【10.0.26100.0-属于 最新的 Windows 11 SDK】(优先级高于项目配置),且_mm_loadu_si64的依赖头文件未被系统头文件(如wchar.h)优先加载。
系统配置-QT5.12.12,MSVC2015
二、 解决方案
需通过强制覆盖项目的头文件 / 库路径优先级 + 预加载 SIMD 头文件彻底解决【更改项目的构建环境】。
本机的旧SDK有【10.0.10240.0】和【10.0.19041.0】:
其中,10.0.10240.0是非常旧的 Windows 10 SDK 版本(对应 Windows 10 1507 版),部分早期版本的 SDK 目录结构可能不完整,甚至缺少um文件夹(um是 "User Mode" 的缩写,包含windows.h等核心头文件)。
Qt 5.12.12 支持 MSVC2015,而10.0.19041.0是 Windows 10 SDK(对应 2004 版),MSVC2015 可以兼容这个 SDK 版本(MSVC2015 及以上的工具集对高版本 SDK 有向下兼容性)。
且10.0.19041.0版本的 SDK必然包含um文件夹(这是新版 SDK 的标准目录结构,windows.h就位于...\10.0.19041.0\um\下)。
步骤1:修改.pro文件(强制锁定旧 SDK 路径,覆盖系统默认)
将.pro文件中 SDK 相关配置替换为以下内容(直接用 QT 的INCLUDEPATH/LIBS,优先级高于编译器参数):
cpp
# 1. 强制指定旧SDK的头文件路径(覆盖系统所有默认路径)
INCLUDEPATH += \
D:\Windows Kits\10\Include\10.0.19041.0\ucrt \
D:\Windows Kits\10\Include\10.0.19041.0\um \
D:\Windows Kits\10\Include\10.0.19041.0\shared
# 2. 强制指定旧SDK的库路径
LIBS += \
-L"D:\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64" \
-L"D:\Windows Kits\10\Lib\10.0.19041.0\um\x64"
# 3. 启用SSE2指令集+强制预定义宏(绑定旧SDK)
QMAKE_CXXFLAGS += /arch:SSE2 /D "_WIN32_WINNT=0x0A00" /D "__SSE2__"
# 4. 强制预包含SIMD头文件(确保在wchar.h之前加载)
QMAKE_CXXFLAGS += /FI"intrin.h" /FI"emmintrin.h"
# 指定资源编译器路径(若系统rc.exe版本不匹配)
QMAKE_RC = D:\Windows Kits\10\bin\10.0.19041.0\x64\rc.exe
/FI参数:强制在所有源文件的最开头包含指定头文件,确保_mm_loadu_si64的定义先于wchar.h加载。
步骤2:彻底清除系统 SDK 的环境变量干扰
在项目的「Build Environment」中,添加以下变量(覆盖系统级 SDK 路径):
变量名 变量值(替换为你的旧 SDK 路径)
cpp
INCLUDE D:\Windows Kits\10\Include\10.0.19041.0\ucrt;D:\Windows Kits\10\Include\10.0.19041.0\um;D:\Windows Kits\10\Include\10.0.19041.0\shared;D:\Windows Kits\10\Include\10.0.19041.0\winrt
cpp
LIB D:\Windows Kits\10\Lib\10.0.19041.0\ucrt\x64;D:\Windows Kits\10\Lib\10.0.19041.0\um\x64
-
【Build Environment】- INCLUDE


-
【Build Environment】- LIB

-
【Build Environment】- Windows SDK

步骤 3:重建项目(确保无缓存残留)
关闭 QT Creator;
删除项目目录下的所有构建文件夹(包括隐藏的缓存文件);
重新打开 QT Creator,导入项目(不要直接打开旧工程,选择「导入现有项目」);
执行「Run qmake」→「Build」。
步骤4:指定资源编译器rc.exe-【LNK1158: 无法运行 "rc.exe"】
若在重构项目后,出现报错【LNK1158: 无法运行 "rc.exe"】,核心原因是Qt 构建过程中找不到资源编译器rc.exe,而当前的.pro配置虽然指定了 SDK 路径,但 rc.exe的路径并未被正确加入到构建环境的PATH中 。
1、问题分析
rc.exe是 Windows SDK 中的资源编译器,用于编译.rc资源文件。配置中虽然用QMAKE_RC指定了rc.exe的路径,但 Qt 的构建工具(jom/make)可能仍无法在PATH中找到它,或者缺少其依赖的rcdll.dll文件。
2、解决方案:直接让rc.exe可被系统找到
-
方法 1:
将rc.exe路径添加到项目的PATH环境变量
在 Qt Creator 的「项目」→「构建设置」→「Build Environment」中,编辑PATH变量,添加rc.exe所在的目录:
- 变量名:PATH
- 变量值:在原有内容后追加(注意用分号分隔):D:\Windows Kits\10\bin\10.0.19041.0\x64
-
方法 2:
手动复制【rc.exe】和【rcdll.dll】到 Qt 的 bin 目录
找到【rc.exe】和【rcdll.dll】:路径是D:\Windows Kits\10\bin\10.0.19041.0\x64(和你指定的QMAKE_RC路径一致)。
复制这两个文件到Qt 的 MSVC 编译器 bin 目录:比如D:\QT5.12.12\5.12.12\msvc2015_64\bin(对应你的 Qt 版本和编译器架构)。
三、关键原理说明
用INCLUDEPATH/LIBS替代编译器参数:QT 的INCLUDEPATH/LIBS会直接覆盖系统默认的头文件 / 库路径,避免新版 SDK 路径被读取;
/FI强制预包含:让intrin.h/emmintrin.h在wchar.h之前加载,确保_mm_loadu_si64的定义被系统头文件识别。
完成以上操作后,项目会完全脱离系统 SDK 的干扰,强制使用旧 SDK 并正确加载_mm_loadu_si64的依赖,解决标识符找不到的问题。