You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:35:28