#events #loops #libevent

sys libuv-sys2

libuv的轻量级FFI绑定

31个稳定版本

1.48.0 2024年2月8日
1.47.0 2023年11月7日
1.46.1 2023年10月14日
1.44.2 2022年9月3日
1.35.3 2020年3月19日

命令行界面 中排名165

Download history 218/week @ 2024-03-11 47/week @ 2024-03-18 32/week @ 2024-03-25 171/week @ 2024-04-01 82/week @ 2024-04-08 75/week @ 2024-04-15 87/week @ 2024-04-22 70/week @ 2024-04-29 68/week @ 2024-05-06 116/week @ 2024-05-13 100/week @ 2024-05-20 113/week @ 2024-05-27 82/week @ 2024-06-03 75/week @ 2024-06-10 72/week @ 2024-06-17 79/week @ 2024-06-24

每月下载量316
用于 4 crates

自定义许可协议

2.5MB
64K SLoC

C 62K SLoC // 0.2% comments Automake 498 SLoC // 0.0% comments M4 493 SLoC // 0.3% comments Rust 322 SLoC // 0.1% comments Batch 238 SLoC // 0.0% comments Shell 153 SLoC // 0.2% comments Python 120 SLoC // 0.7% comments JavaScript 18 SLoC

包含 (晦涩的autoconf代码, 5KB) libuv/configure.ac

Build Status Latest Release

libuv-sys2

libuv-sys2为libuv库提供FFI绑定。

为什么选择libuv-sys2?

我致力于维护libuv-sys2。实际上,发布过程大部分是自动化的。当libuv发布新版本时,你可能会在几分钟内看到libuv-sys2的相应版本。有时发布无法完全自动化。在这些情况下,如果需要手动进行一些更改,我的目标是24小时内发布。

版本控制

libuv-sys2使用语义版本控制,类似于libuv。libuv-sys2的主版本和次要版本绑定到libuv的特定主版本和次要版本,即,libuv-sys2 v1.30.x对应于libuv的v1.30.x。libuv-sys2的补丁版本将在libuv发布新补丁版本时更改,或者如果libuv-sys2进行更新。

注意:bindgen在v1.45.0中进行了更新,这改变了许多导出函数的类型,因此如果你从早期版本升级,可能需要做出一些更改。

入门指南

在Cargo.toml中将libuv-sys2作为依赖项。建议在指定libuv-sys2的依赖项时使用波浪号运算符,这样你将自动接收最新的错误修复,而无需任何破坏性API更改。例如

[dependencies]
libuv-sys2 = "~1.34.1"

这将等同于指定版本为>= 1.34.1, < 1.35.0

如果你需要特定版本的libuv,请查看发布页面以找到与所需libuv补丁对应的libuv-sys2版本。

在底层,libuv-sys2 使用 bindgen 生成与 libuv 的绑定。如果您在编译 libuv-sys2 时遇到问题,请查阅 bindgen 文档,确保已安装所有必需的软件。例如,在 Windows 上,您需要使用 msvc 工具链来编译 libuv-sys2。

libuv-sys2 将尝试使用 pkg-config 来查找匹配的本地安装的 libuv。如果失败,它将从源代码构建 libuv。从版本 1.40.1 开始,您可以通过启用 skip-pkg-config 功能始终从源代码构建。在早期版本中,您可以通过设置名为 LIBUV_NO_PKG_CONFIG 的环境变量来跳过 pkg-config。有关更多信息,请参阅 pkg-config 文档。

使用方法

将库导入您的项目中

#[macro_use]
extern crate libuv_sys2;

由于此库是对 libuv 的薄绑定,您首先应该熟悉 libuv 的文档。熟悉了概念后,请查看 示例

一些一般建议:任何计划传递给 libuv 的数据(如 libuv 处理类型)应该 可能 在堆上分配(例如使用 Box)。这样,它们将具有稳定的内存地址。请注意,rust 的默认分配是在栈上,这意味着如果将其传递给函数或从函数返回,它们的内存地址将改变,并且一旦超出作用域就会进行清理。编写一个可以编译但无法运行或导致各种未定义行为的程序很容易,因为在与库交互时传递了很多原始的不安全指针。如果某些东西不起作用,但您非常确信您在 libuv 方面做的是正确的,请确保您的数据具有稳定的内存地址。

除了所有 libuv 功能的绑定之外,此库还提供了一个便利宏:uv_handle!。此宏可以用于将任何类型引用或原始指针转换为不同类型的原始指针。这在使用 libuvuv_SOMETHING_t 转换为 uv_handle_t 时非常有用。例如

let mut tty: uv_tty_t = unsafe { mem::zeroed() };

// without the macro, you'd need to cast the reference to a raw pointer of the
// same type, and then cast that as a raw pointer of the target type:
let handle: *mut uv_handle_t = &mut tty as *mut uv_tty_t as *mut uv_handle_t;

// the macro is much more wieldy:
let handle: *mut uv_handle_t = uv_handle!(&mut tty);

跨平台考虑事项

似乎在 Windows 上 uv_buf_t.len 的类型不同。一个简单的解决方案是使用 usize(它在其他地方似乎默认使用),然后在您读取或写入 uv_buf_t.len 的任何地方,只需在末尾添加一个 as _ 即可,编译器将做正确的事情。例如

let buf: uv_buf_t = { base: my_ptr, len: my_len as _ };
let buflen: usize = buf.len as _;

说到 Windows,由于使用了 bindgen 来生成绑定,您需要使用 rust 的 msvc 工具链来编译 libuv-sys2!

依赖项