2014-12-26 1 views
2

Я пытаюсь использовать некоторые библиотеки Rust из ящиков на Github. Это первый раз, когда я пытался это сделать. Код, поднял из "HTML" библиотеки, например, начинается так:Невозможно найти символы из внешних ящиков, включенных в `use`

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 http и extern crate url не генерируют ошибок; комбайнеры обнаруживают ящики, но эти ящики, похоже, не содержат ожидаемых символов. Если я добавлю «extern crate foo», я получаю сообщение об ошибке, так что это проверено.

Возможно, это проблема с поиском Rust или Cargo для библиотек. Rust установлен в ~/local, а не как root, .. параметр --prefix во время установки, что может быть нарушено что-то, хотя Груз должен обрабатывать, что основные вещи, как «hello_world» работает отлично, привлечение внешних библиотек не

Я заметил, что cargo update не вызывает повторную выборку. из http и url-ящиков от Github. Документация указывает, что она должна.

Версии:

  • 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)

ответ

13

Компилятор предоставил вам ответ, который вам нужен.

Ваших extern crate заявление внутри модуля, и use заявлений требуют абсолютных пути. То есть, когда вы говорите use url::Url; внутри модуля interactive_test, то, что вы на самом деле говорите, это «использовать url::Url, который определен в корневом модуле», который он не является.

Что вам нужно сделать, это префикс пути с self::, чтобы сказать ему, чтобы он смотрел в текущем модуле. Вы также можете использовать super:: для доступа к родительскому модулю (если это когда-либо появляется).

Лично я обойду это, поставив все свои операторы extern crate в корневой модуль, который также служит своего рода программным списком используемых внешних ящиков.