3

我正在使用 rust 编译和构建一个示例程序。我选择rustc而不是cargo编译,因为它是一个简单的个人测试项目。到目前为止,rustc用于编译和构建可执行文件的工作正常,但是当我尝试添加外部rand包时,它给了我这个错误

1 | extern crate rand;
  | ^^^^^^^^^^^^^^^^^^ can't find crate

这是完整的代码

extern crate rand;

use rand::Rng;

fn main() {
    for x in 1..11 {
        let random_number = rand::thread_rng()
            .gen_range(1, 101);
        println!("{} -> {}", x, random_number)
    }
}

如何添加外部包并运行rustc

4

2 回答 2

6

这在没有 Cargo 的情况下是可能的,但你必须做它通常为你做的事情。

  1. 下载所有依赖项。
  2. rustc使用正确的标志编译所有依赖项。
rand v0.7.3
├── getrandom v0.1.14
│   ├── cfg-if v0.1.10
│   └── libc v0.2.66
├── libc v0.2.66 (*)
├── rand_chacha v0.2.1
│   ├── c2-chacha v0.2.3
│   │   └── ppv-lite86 v0.2.6
│   └── rand_core v0.5.1
│       └── getrandom v0.1.14 (*)
└── rand_core v0.5.1 (*)

rand还不错,只有 8 个传递依赖项(包括rand自身,不包括重复项)。不过,您必须访问 crates.io 或 github 并为每个下载正确版本的源代码。

然后是编译。编译自己的二进制文件所需要做的最低限度是rustc -L dependency=/path/to/dependency/dir src/main.rs. 但请记住,您必须对 8 个依赖项中的每一个都执行此操作,并且所有这些依赖项都有自己的外部依赖项。您还需要找出正确的顺序来编译它们。

此外,有些箱子有自己的设置,Cargo.toml必须尊重。一些 crate 甚至有一个需要编译和运行的构建脚本(libc是这个依赖树中的一个例子)。


或者,你可以把

[dependencies]
rand = "0.7.3"

在你Cargo.toml和运行cargo build。你的选择。Cargo 是 Rust 最好的东西之一,所以我建议你使用它。


PS 要查看到底cargo在做什么,请运行cargo clean以删除任何已编译的依赖项。然后跑cargo build --verbose(或者cargo build -vv如果你很勇敢)。您将看到传递给 的所有标志、rustc运行的脚本以及其他所有内容。

于 2020-01-26T06:57:47.563 回答
3

我想扩展@SCappella 的答案。我鼓励你也使用cargo。如果您熟悉其他语言(如 JS、PHP 或 Python)的包管理器,您可能会对cargo edit感兴趣。

它允许您在 CLI 中运行命令cargo add rand(最新版本)、cargo add rand@0.7.3(特定版本)、cargo upgrade rand(仅升级rand)、cargo upgrade(升级所有依赖项),而不是Cargo.toml直接编辑文件。

要安装它,请运行cargo install cargo-edit,然后阅读网站上有关如何使用它的文档。

于 2020-01-26T22:11:43.267 回答