如何处理 Rust/Cargo 中的 3rd 方静态 C 库依赖项?

How to handle 3rd-party static C library dependencies in Rust/Cargo?

有一个第 3 方 C 库,我想 link 添加到我的 Rust 项目中。它托管在 github 上,仅作为静态库编译。有没有办法让 Cargo 为我获取这种依赖?我认为没有。我尝试将其添加为依赖项,但出现 "Could not find Cargo.toml in ..." 错误。

作为替代方案,我考虑修改我的 build.rs 文件以使用 git2-rs crate 下载库的标签,可能指定为通过环境变量传递的标签名称。

另一种选择是在我的项目中包含 C 库的源代码,但我在想如果我的板条箱的用户想要在我的板条箱中使用不同(但兼容)版本的第 3 方库,他们不会那么容易做到。

社区中的其他人如何处理此类情况?

通常,您想创建一个 libfoo-sys crate. That crate will have a build script 来编译本机库并设置链接器选项。

构建脚本可以使用 cc crate 等构建时依赖项来简化本地库的下载和编译过程。

您可以使用环境变量或功能来选择本地库的来源。您可以使用用户已经通过他们的系统包管理器安装的版本(或者可能是手动编译的版本),您可以从某个地方下载源代码,您可以将代码包含在存储库中,或者您可以使用 git 子模块引用另一个 git 存储库而不是实际复制代码。

在许多情况下,您还将使用 rust-bindgen 之类的工具来为 C 库创建 "raw" Rust 绑定。​​