#platform #header #libc #native-bindings #constants #compatibility #found

libc-interface

一个库,用于在libc或其他常用平台库中常见的类型

3个版本

使用旧的Rust 2015

0.1.2 2021年1月4日
0.1.1 2020年3月25日
0.1.0 2018年8月3日

#157 in 操作系统

Download history 21/week @ 2024-03-11 18/week @ 2024-03-18 32/week @ 2024-03-25 87/week @ 2024-04-01 15/week @ 2024-04-08 23/week @ 2024-04-15 21/week @ 2024-04-22 16/week @ 2024-04-29 13/week @ 2024-05-06 40/week @ 2024-05-13 16/week @ 2024-05-20 11/week @ 2024-05-27 13/week @ 2024-06-03 12/week @ 2024-06-10 16/week @ 2024-06-17 17/week @ 2024-06-24

每月59次下载
用于 7 个crate(5 个直接使用)

MIT/Apache

1.5MB
40K SLoC

libc

一个Rust库,具有与各种系统(包括libc)中常见的类型和函数的本地绑定。

Build Status Build status Latest version Documentation License

使用方法

首先,将以下内容添加到您的 Cargo.toml

[dependencies]
libc = "0.2"

然后,将以下内容添加到您的crate根目录

extern crate libc;

目前,libc默认链接到标准库,但如果您想在一个 #![no_std] 环境或crate中使用libc,可以通过以下方式请求此功能:

[dependencies]
libc = { version = "0.2", default-features = false }

默认情况下,libc使用结构体中的私有字段来强制执行特定的内存对齐。这些结构体在libc之外很难实例化。要使libc使用 #[repr(align(x))],而不是私有字段,激活 align 功能。这需要Rust 1.25或更高版本

[dependencies]
libc = { version = "0.2", features = ["align"] }

什么是libc?

此crate的主要目的是提供与Rust支持的所有平台上的C代码(或“类似C”代码)交互所需的所有定义,以便轻松操作。这包括类型定义(例如 c_int)、常量(例如 EINVAL)以及函数头(例如 malloc)。

此crate不追求跨平台的任何形式的兼容性,而是简单地直接绑定到特定平台上的系统库。

公共API

此crate将所有底层平台类型、函数和常量导出为crate根下的,因此所有项都可以作为 libc::foo 访问。所有导出API的类型和值都与为libc编译的平台匹配。

有关此库设计的更详细信息,请参阅其 相关RFC

添加API

想要使用目前未绑定在 libc 中的 API 吗?添加一个相当简单!

这个包的内部结构设计为最小化 #[cfg] 属性的数量,以便能够轻松添加适用于所有平台的新项目。因此,该包根据平台进行组织。每个模块都有多个 #[cfg] 标注的子模块,但实际编译的只有一个。每个模块随后导出其子模块的所有内容。

这意味着对于 libc 所支持的每个平台,从叶模块到根模块的路径将包含针对该平台的所有绑定。因此,这表明了在哪里应该添加 API!在层次结构中的特定级别添加 API 意味着它支持该级别的所有子平台。例如,当添加 Unix API 时,它应该添加到 src/unix/mod.rs,但当添加仅适用于 Linux 的 API 时,它应该添加到 src/unix/notbsd/linux/mod.rs

如果你不确定 API 应该添加在层次结构的哪个级别,不必担心!这个包有 CI 支持,它会测试任何绑定是否与所有支持的平台兼容,所以如果你在错误级别添加了 API 或跨平台有不同的签名,你会看到失败。

考虑到这一点,添加新 API 的步骤如下

  1. 确定你的 API 应该添加到模块层次结构的哪个位置。
  2. 添加 API。
  3. 向此存储库发送 PR。
  4. 等待 CI 通过,修复错误。
  5. 等待合并!

在提交之前进行测试

我们在 Travis 上运行了两个自动化测试

  1. libc-test
  • cdlibc-test && cargotest
  • 如果你确实需要解决方案,请使用 skip_*() 函数在 build.rs 中。
  1. 风格检查器
  • rustcci/style.rs && ./stylesrc

将您的更改发布到 crates.io

现在,您已经完成了在这个包中着陆您的 API 或您的新平台这一令人惊叹的工作,下一步是将这些甜蜜的甜蜜使用从 crates.io 获取!下一步只是增加 libc 的版本并将它发布。如果您希望尽快发布,可以遵循以下步骤

  1. 更新 Cargo.toml 中的版本号,您只需增加补丁版本号。
  2. 运行 cargo update 重新生成 lockfile,以将版本提升编码到 lockfile 中。您可能会引入一些其他更新的依赖项,这是可以的。
  3. 向此存储库发送 PR。它应该 看起来像这样,但最好在描述中添加一个关于发布的小理由(任何理由都可以!)
  4. 合并后,由 libc 包维护者之一进行标记和发布。

平台和文档

以下平台目前经过测试并提供了文档

已测试

以下可能受支持,但无法保证始终工作

无运行时依赖

功能