如何在Rust中使用单头文件C库?
在Rust中使用单头文件C库的可行方案
针对你的场景,以下是具体可行的步骤,结合cc和bindgen crate可以快速解决问题:
1. 配置Cargo依赖
修改Cargo.toml,添加编译依赖cc(用于编译C代码生成库)和可选的bindgen(自动生成Rust绑定,避免手动编写extern块):
[package] name = "rust-test" version = "0.1.0" edition = "2021" [dependencies] libc = "0.2.133" bindgen = "0.60.1" # 可选,自动生成绑定用 [build-dependencies] cc = "1.0"
2. 编写build.rs编译C库
在项目根目录创建build.rs,用来编译你的单头文件生成静态库,同时可选生成Rust绑定:
use std::path::Path; fn main() { // 编译单头文件为静态库 cc::Build::new() .file("src/variation-ui.h") // 替换成你的头文件实际路径 .compile("variation-ui"); // 生成的库名,Windows下会自动加lib前缀 // 可选:用bindgen自动生成Rust绑定 let bindings = bindgen::Builder::default() .header("src/variation-ui.h") .generate() .expect("生成绑定失败"); // 将绑定写入OUT_DIR目录 let out_path = Path::new(&std::env::var("OUT_DIR").unwrap()); bindings .write_to_file(out_path.join("bindings.rs")) .expect("写入绑定文件失败"); }
3. 在main.rs中调用C函数
方式一:使用自动生成的绑定
直接引入bindgen生成的绑定文件,无需手动声明extern:
// 引入自动生成的绑定 include!(concat!(env!("OUT_DIR"), "/bindings.rs")); fn main() { unsafe { vn_clear(); // 直接调用生成的函数 } println!("是否成功运行?"); }
方式二:手动声明extern块
如果不想用bindgen,确保链接名正确(对应cc编译的库名):
#[link(name = "variation-ui")] // Windows下实际链接的是libvariation-ui.lib extern "C" { fn vn_clear(); } fn main() { unsafe { vn_clear(); } println!("是否成功运行?"); }
关键注意事项
- 确保你的单头文件中函数使用C链接规范,若包含C++代码需包裹在
extern "C"块中(你的库在Python可用,应该已处理此问题) - 确认Visual Studio 2022已安装C++开发工具链,Cargo会自动调用VS的编译器
- 头文件路径要与build.rs中指定的路径一致,可根据实际存放位置调整
内容的提问来源于stack exchange,提问作者Hakkı Anıl Ragıboğlu
相关产品推荐
相关产品推荐

