如何在Rust/Cargo中处理第三方静态C库依赖?

6
我想在我的Rust项目中链接一个第三方的C语言库,该库存储于Github中,只能编译为静态库。有没有什么方法可以让Cargo自动获取这个依赖项?我认为没有。我尝试将它添加为一个依赖项,但是遇到了“Could not find Cargo.toml in ...”错误。
作为替代方案,我考虑修改我的build.rs文件,使用git2-rs库下载该库的标签版本,可能会通过环境变量传递标签名称。
另一个选择是将C库的源代码包含到我的项目中,但是我认为如果我的crate的用户想要使用与我的crate兼容的不同版本的第三方库,他们不会那么容易地实现。
因此,社区中的其他人如何处理这种情况呢?
1个回答

11

一般来说,您需要创建一个 libfoo-sys 包。该包将有一个构建脚本,用于编译本地库并设置链接器选项。

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

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

在许多情况下,您还将使用类似 rust-bindgen 的工具为 C 库创建“原始” Rust 绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接