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

标签 rust rust-cargo

我想在我的 Rust 项目中链接到第 3 方 C 库。它托管在 github 上,仅作为静态库编译。有没有办法让 Cargo 为我获取这种依赖?我认为没有。我尝试将其添加为依赖项,但出现“无法在 ... 中找到 Cargo.toml”错误。

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

另一种选择是在我的项目中包含 C 库的源代码,但我在想,如果我的 crate 的用户想要在我的 crate 中使用不同(但兼容)版本的第 3 方库,他们不会能够如此轻松地做到这一点。

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

最佳答案

一般来说,你想创建一个libfoo-sys crate .那个 crate 将有一个 build script编译 native 库并设置链接器选项。

构建脚本可以使用构建时依赖项,例如 cc crate使下载和编译 native 库的过程更容易。

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

在很多情况下,您还会使用像rust-bindgen 这样的工具。为 C 库创建“原始”Rust 绑定(bind)。​​

关于rust - 如何处理 Rust/Cargo 中的 3rd 方静态 C 库依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37769243/

相关文章:

generics - 如何结合 std::str::lines 和 std::io::lines?

string - 将 Path 转换为 *c_char 的最直接方法是什么?

rust - 不能可变地借用模式守卫 [E0301]

c++ - 如何在 C++ 中启用 Rust 所有权范式

rust - Rust stdweb无法编译

rust - 在 Windows 上编译 ruSTLess 的基本示例时出现 "could not rename crate"

rust - 具有特征的通用 API

rust - Cargo 可以在不构建应用程序的情况下下载和构建依赖项吗?

rust - 无法编译 stb_truetype 0.2.4 因为 "slice pattern syntax is experimental"

rust - 交叉编译后缺少共享库的替代解决方案?