Crubit,C++/Rust 双向互操作工具
摘要
Crubit 是 Google 的双向绑定生成器,它实现了 C++ 和 Rust 之间的无缝互操作,使两种语言能够相互调用对方的函数。文档包括示例、演练教程和支持功能的状态页面。
<p><a href="https://lobste.rs/s/9ofzvx/crubit_c_rust_bidirectional_interop_tool">评论</a></p>
查看缓存全文
缓存时间: 2026/08/06 22:14
# 首页 - Crubit 文档
来源:https://crubit.rs/
## 键盘快捷键
按 ← 或 → 在章节之间导航
按 S 或 / 在书中搜索
按 ? 显示此帮助
按 Esc 隐藏此帮助
## Crubit 文档
rust workflow (https://github.com/google/crubit/actions/workflows/rust.yml) GitHub (https://github.com/google/crubit)
Crubit 是一个面向 C++ 和 Rust 的双向绑定生成器,旨在整合 C++ 和 Rust 生态系统。
## 状态 (https://crubit.rs/#status)
查看状态 (http://crubit.rs/overview/status) 页面,了解当前支持的功能概览。
## 示例 (https://crubit.rs/#example)
考虑以下 Rust 库:
``
#![allow(unused)]
fn main() {
pub struct Account {
pub id: u64,
pub balance: f64,
}
impl std::fmt::Display for Account {
...
}
// Takes shared references, mapped to const references in C++.
pub fn calculate_interest(account: &Account, rate: f64) -> f64 {
...
}
// Takes a string slice, mapped to rs_std::StrRef in C++.
pub fn is_valid_username(username: &str) -> bool {
...
}
}
``
你可以从 C++ 调用这些 Rust 函数:
``
#include "path/to/account.h"
#include <iostream>
void demo() {
account::Account my_account{.id = 123, .balance = 1000.0};
double interest = account::calculate_interest(my_account, 0.05);
// my_account is printable because Account implements Display in Rust!
std::cout << my_account << std::endl;
if (account::is_valid_username("bob")) {
std::cout << "Valid user" << std::endl;
}
}
``
考虑以下 C++ 头文件:
``
#include <cstdint>
#include <memory>
#include <optional>
#include <string_view>
struct User {
int id;
double balance;
};
std::optional<User> FindUser(int id);
std::unique_ptr<User> CreateUser(std::string_view name, int id);
``
你可以从 Rust 调用这些 C++ 函数:
``
use cc_std::std::unique_ptr;
use ffi_11::{c_double, c_int};
use user_api::{CreateUser, FindUser, User};
let id: c_int = 123;
let user: Option<&User> = FindUser(id);
if let Some(u) = user {
let balance: c_double = u.balance;
println!("User {} has balance {}", u.id, balance);
}
let new_user: unique_ptr<User> = CreateUser("Alice".into(), 456);
``
## 入门 (https://crubit.rs/#getting-started)
我们提供了使用 Crubit 的详细教程,涵盖如何从 Rust 使用 C++,或从 C++ 使用 Rust,以及可直接复制粘贴的示例代码。示例代码还包括生成绑定的快照。
- 教程:Rust 库的 C++ 绑定 (http://crubit.rs/rust)
- 示例:`examples/rust/` (https://github.com/google/crubit/tree/main/examples/rust)
- 教程:C++ 库的 Rust 绑定 (http://crubit.rs/cpp)
- 示例:`examples/cpp/` (https://github.com/google/crubit/tree/main/examples/cpp)
## 测试矩阵 (https://crubit.rs/#test-matrix)
https://crubit.rs/overview/status.html
https://crubit.rs/overview/status.html
相似文章
crustc: 整个rustc编译器,已翻译成C语言
一个名为cilly的Rust到C编译器工具链已成功将整个rustc编译器翻译成4600万行C代码,生成了一个可以用GCC构建的功能性Rust编译器。该项目旨在通过生成可移植的C代码,使Rust能够在老旧/冷门硬件上运行。
Cpp2Rust: 从C++到安全Rust的自动翻译
Cpp2Rust 是一个开源工具,利用 clang 的 AST 和一个运行时库,自动将 C++ 代码转换为安全的 Rust 代码,支持安全和 unsafe 两种输出模式,实现安全的内存安全转换。
Diplomat:面向 Rust 库的多语言 FFI
Diplomat 是一个多语言单向 FFI 工具,用于封装 Rust 库,旨在将 Rust API 暴露给 C++、JS、Dart 和 JVM 等语言,而无需 FFI 专业知识,填补了 Rust 工具生态系统中的空白。
我开发了 Rust 的 Cargo 的克隆版,但是针对 C++
CRow 是一个新的 C/C++ 开源构建系统和依赖管理器,模仿了 Rust 的 Cargo 的简单性。
如何将C/C++项目重写为Rust?
本文讨论了将C/C++项目迁移到Rust的策略,强调增量迁移而非全面重写,并引用了Luca Palmieri和JetBrains的见解。