如何在Rust中通过bindgen引入Windows.h以完成SimConnect SDK绑定并构建MSFS2020插件?
解决Rust bindgen找不到Windows.h的问题
我之前也碰到过一模一样的情况——用bindgen生成MSFS2020的SimConnect SDK绑定,VS里编译C++项目能正常找到Windows.h,但Rust构建环境就是死活找不到。核心原因是Rust的构建环境不会自动继承Visual Studio配置的Windows SDK和VC工具链路径,下面给你几个实用的解决办法:
方法一:用Visual Studio开发者命令提示符构建
这是最省心的办法,因为VS的开发者命令提示符会自动运行vcvarsall.bat,把Windows SDK、VC工具链的头文件和库路径全部注入到环境变量里:
- 打开「开始菜单」,搜索「Developer Command Prompt for Visual Studio 2022」(如果是专业版就选对应的Professional版本)
- 在这个命令提示符里切换到你的Rust项目目录
- 直接运行
cargo build或cargo check,bindgen就能顺利找到Windows.h了
方法二:在build.rs中手动指定头文件路径
如果不想每次都依赖开发者提示符,可以在项目的build.rs里手动给bindgen添加头文件搜索路径,步骤如下:
- 先找到你的Windows SDK和VC工具链的头文件路径:
- Windows SDK头文件通常在
C:\Program Files (x86)\Windows Kits\10\Include\<你的SDK版本号>,里面有um(用户模式头文件)和shared(共享头文件)两个关键子目录 - VC工具链的头文件在
C:\Program Files\Microsoft Visual Studio\2022\<你的VS版本>\VC\Tools\MSVC\<编译器版本>\include
- Windows SDK头文件通常在
- 修改
build.rs,给bindgen添加clang_arg参数指定这些路径:
use bindgen; use std::env; use std::path::PathBuf; fn main() { // 替换成你自己的Windows SDK版本、VS安装路径和编译器版本 let windows_sdk_version = "10.0.22621.0"; let vs_install_path = "C:/Program Files/Microsoft Visual Studio/2022/Community"; let msvc_version = "14.38.33130"; // 构建完整的头文件路径 let windows_sdk_include = format!("C:/Program Files (x86)/Windows Kits/10/Include/{}", windows_sdk_version); let um_include = format!("{}/um", windows_sdk_include); let shared_include = format!("{}/shared", windows_sdk_include); let msvc_include = format!("{}/VC/Tools/MSVC/{}/include", vs_install_path, msvc_version); // 生成SimConnect绑定 let bindings = bindgen::Builder::default() // 指定SimConnect SDK的头文件路径(替换成你实际的路径) .header("vendor/SimConnect/SimConnect.h") // 添加所有必要的头文件搜索路径 .clang_arg(format!("-I{}", um_include)) .clang_arg(format!("-I{}", shared_include)) .clang_arg(format!("-I{}", msvc_include)) // 可选:过滤掉无关绑定,减少生成文件体积 .whitelist_function("SimConnect.*") .whitelist_type("SimConnect.*") .generate() .expect("Failed to generate SimConnect bindings"); // 将绑定文件输出到编译目录 let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_path.join("simconnect_bindings.rs")) .expect("Couldn't write bindings to file!"); }
- 保存后运行
cargo build,bindgen就能正常找到Windows.h和SimConnect的头文件了
额外检查项
- 确认
LIBCLANG_PATH环境变量确实指向LLVM的bin目录(比如C:\Program Files\LLVM\bin),并且已经重启终端让环境变量生效 - 检查Visual Studio安装时是否勾选了「Windows 10 SDK」或「Windows 11 SDK」组件,如果没装,打开VS Installer补充安装即可
- 如果是64位项目,确保路径对应x64架构(32位项目则用x86路径)
内容的提问来源于stack exchange,提问作者P.E. Joëssel
相关产品推荐
相关产品推荐

