首页 > 解决方案 > 处理货物箱的依赖关系

问题描述

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

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

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

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

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

我是不是做错了什么,或者这就是 Rust/Cargo 的情况?

标签: rustrust-cargo

解决方案


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

话虽如此,它是一个非常灵活的工具,因此提供与用其他语言编写的库的绑定的 crate 可以“捆绑”它们所依赖的库。

例如,Rust-SDL2 crate 确实提供了这样的功能 - 正如其README中所说:

从 0.31 开始,这个 crate 支持一个名为“bundled”的特性,它从源代码下载 SDL2,编译它并自动链接它。

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

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

并非所有此类绑定 crate 都支持绑定,尤其是如果它们绑定的库很大、很复杂、有很多自己的依赖项和/或有很多编译时配置选项。

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


推荐阅读