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

Joh*_*gle 3 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() {}
Run Code Online (Sandbox Code Playgroud)

错误看起来像这样:

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`?
Run Code Online (Sandbox Code Playgroud)

Cargo.toml文件包含

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

[dependencies.url]
url = "0.2.7"
Run Code Online (Sandbox Code Playgroud)

并且cargo build之前找到并获取了HTTP和URL包.

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

这可能是Rust或Cargo如何搜索库的一些问题.~/local通过--prefix在安装期间设置参数来安装Rust ,而不是root用户.这可能已经打破了一些东西,尽管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)

DK.*_*DK. 17

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

您的extern crate语句位于模块内,use语句需要绝对路径.也就是说,当你use url::Url;interactive_test模块内部说,你实际上说的是"使用url::Url在根模块中定义的",它不是.

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

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