3

我正在尝试使用 Github 上 crates 中的一些 Rust 库。这是我第一次尝试这样做。从“html”库示例中提取的代码如下所示:

mod interactive_test {
    extern crate http;
    extern crate url;
    use std::os;
    use std::str;
    use url::Url;

    use http::client::RequestWriter;
    use http::method::Get;
    use http::headers::HeaderEnum;
    // ...
}

fn main() {}

错误如下所示:

error[E0432]: unresolved import `url::Url`
 --> src/main.rs:7:9
  |
7 |     use url::Url;
  |         ^^^^^^^^ Did you mean `self::url`?

error[E0432]: unresolved import `http::client::RequestWriter`
 --> src/main.rs:9:9
  |
9 |     use http::client::RequestWriter;
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Did you mean `interactive_test::http`?

error[E0432]: unresolved import `http::method::Get`
  --> src/main.rs:10:9
   |
10 |     use http::method::Get;
   |         ^^^^^^^^^^^^^^^^^ Did you mean `self::http::method`?

error[E0432]: unresolved import `http::headers::HeaderEnum`
  --> src/main.rs:11:9
   |
11 |     use http::headers::HeaderEnum;
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^ Did you mean `interactive_test::http`?

Cargo.toml文件包含

[dependencies.http]
http = "https://github.com/chris-morgan/rust-http"

[dependencies.url]
url = "0.2.7"

并且 HTTP 和 URL 包是cargo build之前找到并获取的。

extern crate httpextern crate url不会产生错误;编译器正在找到这些板条箱,但这些板条箱似乎不包含预期的符号。如果我添加“extern crate foo”,我会收到一个错误,因此会被选中。

这可能是 Rust 或 Cargo 搜索库的一些问题。Rust 安装在 中~/local,而不是以 root 身份安装,通过--prefix在安装期间设置参数来完成。这可能破坏了某些东西,尽管 Cargo 应该处理这个问题。像“hello_world”这样的基本东西可以正常工作;没有引入外部库。

我注意到这cargo update不会导致从 Github 重新获取 http 和 url crate。文档表明它应该。

版本:

  • Ubuntu 14.04 LTS。
  • rustc 0.13.0-nightly (96a3c7c6a 2014-12-23 22:21:10 +0000)
  • 货物 0.0.1-pre-nightly (e11c317 2014-12-21 20:43:45 +0000)
4

1 回答 1

17

编译器给了你你需要的答案。

您的extern crate语句模块内,并且use语句需要绝对路径。也就是说,当您在模块use url::Url;内部说时interactive_test,您实际上是在说“使用url::Url根模块中定义的”,而不是.

您需要做的是在路径前加上前缀,self::告诉它在当前模块中查找。您还可以使用super::来访问父模块(如果出现的话)。

就个人而言,我通过将我的所有extern crate语句放在根模块中来解决这个问题,它也可以作为一种正在使用的外部 crate 的程序范围列表。

于 2014-12-26T05:45:35.590 回答