无法从“使用”中包含的外部包装箱中找到符号

时间:2014-12-26 05:37:47

标签: rust rust-cargo

我试图在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"

并且cargo build之前找到并提取了HTTP和URL包。

extern crate httpextern crate url行不会产生错误;编译器正在找到包装箱,但这些包装箱似乎不包含预期的符号。如果我添加`extern crate foo",我会收到一个错误,所以检查它。

这可能是Rust或Cargo如何搜索库的一些问题。 Rust在~/local中安装,而不是以root身份安装,通过在安装期间设置--prefix参数来完成。这可能已经打破了一些东西,尽管Cargo应该处理这个问题。基本的东西,如" hello_world"工作良好;引入外部库不会。

我注意到cargo update没有导致从Github重新获取http和url包。文档表明它应该。

版本:

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

1 个答案:

答案 0 :(得分:17)

编译器为您提供了所需的答案。

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

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

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