处理货箱的依赖关系

Dealing with dependencies of cargo crates

我是 Rust 的新手,所以如果我只是做错了可怕的事情,请原谅。

在学习这门语言的同时,我想尝试我已经在其他语言中使用过的库的不同绑定,其中包括 SDL2、SFML2、Gtk3。

令我惊讶的是,开箱即用似乎没有任何效果。它们都依赖于 C 库,而这些库不包含在 cargo crate 中。在遵循自述文件并手动将 .lib 和 .dll 文件复制到正确的位置后,我设法让 SFML2 工作。我试图让 Rust 链接器查看我的 vcpk 目录中的 .lib 文件,遗憾的是没有成功。

包管理器的全部意义在于为您自动化这些事情。其他包管理器,如 C# 的 NuGet,不需要您手动 fiddle 将它们的包的依赖项放在一起。

摆脱 C/C++ 的第三方库管理地狱是我仔细研究 Rust 的原因之一。

是我做错了什么,还是 Rust/Cargo 就是这样?

Cargo 是 Rust 代码的构建管理和源包管理工具 - 它不是用于管理二进制文件或编译其他语言(如 C 或 C++)的工具。

话虽如此,它是一个非常灵活的工具,因此可以将提供对用其他语言编写的库的绑定的板条箱 "bundle" 它们所依赖的库。

例如,Rust-SDL2 crate 确实提供了这样的功能 - 正如他们在 README:

中所说

Since 0.31, this crate supports a feature named "bundled" which downloads SDL2 from source, compiles it and links it automatically.

要使用它,您可以像这样将它添加到您的 Cargo.toml:

[dependancies]
sdl2 = { version = "0.34.0", features=["bundled"] }

并非所有此类绑定箱都支持捆绑,尤其是当它们绑定的库很大、很复杂、有很多自己的依赖项时and/or有很多编译时配置选项。

在这些情况下,您需要安装预编译的二进制文件,或者自己从源代码编译它们。