3个版本
使用旧的Rust 2015
0.1.2 | 2021年1月4日 |
---|---|
0.1.1 | 2020年3月25日 |
0.1.0 | 2018年8月3日 |
#157 in 操作系统
每月59次下载
用于 7 个crate(5 个直接使用)
1.5MB
40K SLoC
libc
一个Rust库,具有与各种系统(包括libc)中常见的类型和函数的本地绑定。
使用方法
首先,将以下内容添加到您的 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 的步骤如下
- 确定你的 API 应该添加到模块层次结构的哪个位置。
- 添加 API。
- 向此存储库发送 PR。
- 等待 CI 通过,修复错误。
- 等待合并!
在提交之前进行测试
我们在 Travis 上运行了两个自动化测试
cdlibc-test && cargotest
- 如果你确实需要解决方案,请使用
skip_*()
函数在build.rs
中。
- 风格检查器
rustcci/style.rs && ./stylesrc
将您的更改发布到 crates.io
现在,您已经完成了在这个包中着陆您的 API 或您的新平台这一令人惊叹的工作,下一步是将这些甜蜜的甜蜜使用从 crates.io 获取!下一步只是增加 libc 的版本并将它发布。如果您希望尽快发布,可以遵循以下步骤
- 更新
Cargo.toml
中的版本号,您只需增加补丁版本号。 - 运行
cargo update
重新生成 lockfile,以将版本提升编码到 lockfile 中。您可能会引入一些其他更新的依赖项,这是可以的。 - 向此存储库发送 PR。它应该 看起来像这样,但最好在描述中添加一个关于发布的小理由(任何理由都可以!)
- 合并后,由 libc 包维护者之一进行标记和发布。
平台和文档
以下平台目前经过测试并提供了文档
已测试
i686-pc-windows-msvc
x86_64-pc-windows-msvc
(Windows)i686-pc-windows-gnu
x86_64-pc-windows-gnu
i686-apple-darwin
x86_64-apple-darwin
(OSX)i386-apple-ios
x86_64-apple-ios
i686-unknown-linux-gnu
x86_64-unknown-linux-gnu
(Linux)x86_64-unknown-linux-musl
(Linux MUSL)aarch64-unknown-linux-gnu
(Linux)aarch64-unknown-linux-musl
(Linux MUSL)sparc64-unknown-linux-gnu
(Linux)mips-unknown-linux-gnu
arm-unknown-linux-gnueabihf
arm-linux-androideabi
(Android)x86_64-unknown-freebsd
x86_64-unknown-openbsd
x86_64-rumprun-netbsd
以下可能受支持,但无法保证始终工作
i686-unknown-freebsd
x86_64-unknown-bitrig
x86_64-unknown-dragonfly
i686-unknown-haiku
x86_64-unknown-haiku
x86_64-unknown-netbsd
x86_64-sun-solaris