我试图在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 http
和extern crate url
行不会产生错误;编译器正在找到包装箱,但这些包装箱似乎不包含预期的符号。如果我添加`extern crate foo",我会收到一个错误,所以检查它。
这可能是Rust或Cargo如何搜索库的一些问题。 Rust在~/local
中安装,而不是以root身份安装,通过在安装期间设置--prefix
参数来完成。这可能已经打破了一些东西,尽管Cargo应该处理这个问题。基本的东西,如" hello_world"工作良好;引入外部库不会。
我注意到cargo update
没有导致从Github重新获取http和url包。文档表明它应该。
版本:
答案 0 :(得分:17)
编译器为您提供了所需的答案。
您的extern crate
语句在模块中,use
语句需要绝对路径。也就是说,当你在use url::Url;
模块中说interactive_test
时,你实际上说的是“使用在根模块中定义的url::Url
”,它不是
您需要做的是在路径前加上self::
,告诉它查看当前模块。您还可以使用super::
访问父模块(如果出现的话)。
就个人而言,我通过将所有extern crate
语句放在根模块中来解决这个问题,根模块也可以作为一种程序范围的外部包装箱列表。