windows arm设备必须使用aarch64-pc-windows-msvc target的llvm工具链,如qualcomm snapdragon llvm arm(开箱即用)或llvm-mingw ucrt-aarch64(需显式指定--target=aarch64-pc-windows-msvc),否则链接失败或运行异常。

Windows ARM设备上必须用 aarch64-pc-windows-msvc target 的 LLVM
ARM64 版 Windows(如 Surface Pro X、Copilot+ PC)不能用 x86_64 或 x86 的 LLVM 安装包——哪怕在模拟层下能跑 clang --version,编译出来的二进制也大概率无法运行或链接失败。关键在于 target 必须匹配:LLVM 必须是 aarch64-pc-windows-msvc,不是 x86_64-pc-windows-msvc,也不是 MinGW 或 UCRT 独立链。
官方预编译包中明确标注 aarch64 的极少,目前稳定可用的来源只有两个:
- Qualcomm 提供的
Snapdragon LLVM ARM工具链(专为 Windows on ARM 优化,含clang、lld、llvm-objdump等,target 固定为aarch64-pc-windows-msvc) -
llvm-mingw的ucrt-aarch64版本(注意:它默认走 UCRT + MinGW 风格,需额外指定--target=aarch64-pc-windows-msvc才能调用 MSVC 链接器,否则会缺msvcp140.dll等运行时)
直接安装 Snapdragon LLVM ARM 工具链最省事
这是目前 Windows ARM 设备上唯一开箱即用、无需手动配头文件和库路径的方案。它由 Qualcomm 维护,内置完整 MSVC 兼容工具链,能直接找到 iostream、Windows.h 和 link.exe。
操作步骤很明确:
- 先装
Qualcomm® Package Manager 3(官网下载,不依赖 VS) - 用该包管理器安装
Snapdragon LLVM ARM(自动选最新版,如16.1.0.0) - 把
C:\Qualcomm\SnapdragonLLVMARM\16.1.0.0\bin加进系统PATH - 新开终端,运行
clang --version,输出里必须含Target: aarch64-pc-windows-msvc
别试图用 clang-cl 模式混搭 x86_64 工具链——ARM64 Windows 不支持跨架构调用 link.exe,会报 error LNK1112: module machine type 'x64' conflicts with target machine type 'ARM64'。
llvm-mingw ucrt-aarch64 可以用,但得绕过默认 MinGW 行为
如果你坚持用 llvm-mingw(比如已有脚本依赖 clang++ -stdlib=libc++),必须显式覆盖 target 和 runtime:
- 下载
llvm-mingw-<date>-ucrt-aarch64.zip</date>,解压到不含空格/中文的路径(如C:\llvm-mingw) - 加
C:\llvm-mingw\bin到PATH - 编译时强制指定:
clang++ --target=aarch64-pc-windows-msvc -fuse-ld=lld demo.cpp - 不能加
-static-libstdc++或-static-libgcc——UCRT 下这些标志无效,会链接失败
漏掉 --target= 就会默认走 aarch64-w64-windows-gnu,导致找不到 stdio.h(因为头文件路径按 GNU 规则找,而 MSVC 头在 Program Files\Microsoft Visual Studio 下)。
别碰自己编译 LLVM,除非你清楚 link.exe 的 ABI 限制
在 ARM64 Windows 上用 CMake + VS2022 编译 LLVM,即使指定 -A ARM64,生成的 clang.exe 默认仍会尝试调用 x64 版 link.exe(因为 VS Build Tools 的 ARM64 支持不完整)。结果就是:
-
clang++ demo.cpp能跑,但卡在链接阶段 - 错误信息是
LINK : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'ARM64' - 手动换
lld又会缺msvcrt.lib、vcruntime.lib等 MSVC 运行时导入库
真正能打通全链路的,只有 Snapdragon LLVM ARM 或官方尚未公开发布的 ARM64 版 VS Build Tools —— 后者目前(2026年9月)仍处于 preview 阶段,不建议生产环境使用。











