rust rust-cargo rust-crates

rust - estructura de carga del mismo código: errores de tiempo de compilación espurios?



rust-cargo rust-crates (1)

Tengo una caja A que depende de B y B depende de la caja de óxido-nmea .

Si construyo el cajón A , tengo un montón de errores (todos los que fallaron use std::error::Error; ) durante la compilación de la dependencia rust-nmea :

error[E0599]: no method named `description` found for type `nom::Err<&[u8]>` in the current scope --> /home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/src/parse.rs:100:44 | 100 | IError::Error(e) => e.description().to_string(), | ^^^^^^^^^^^ | = help: items from traits can only be used if the trait is in scope = note: the following trait is implemented but not in scope, perhaps add a `use` for it: candidate #1: `use std::error::Error;`

Pero si voy al árbol fuente del cajón B y ejecuto cargo build , todo se construye sin ningún error (si me siguen, A depender de B y B depende de rust-nmea ),

también si va a /home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/ (ver error de compilación) y ejecuta cargo build entonces todo está bien.

show del árbol de carga para A :

│ ├── chrono v0.4.0 │ │ ├── num v0.1.40 │ │ │ ├── num-integer v0.1.35 │ │ │ │ └── num-traits v0.1.40 │ │ │ ├── num-iter v0.1.34 │ │ │ │ ├── num-integer v0.1.35 (*) │ │ │ │ └── num-traits v0.1.40 (*) │ │ │ └── num-traits v0.1.40 (*) │ │ └── time v0.1.38 │ │ └── libc v0.2.27 ├── nmea v0.0.6 │ ├── chrono v0.4.0 (*) │ └── nom v3.2.0 │ └── memchr v1.0.1 (*)

y para almacenar en caché por cargo rust-nmea :

├── chrono v0.4.0 │ ├── num v0.1.40 │ │ ├── num-integer v0.1.35 │ │ │ └── num-traits v0.1.40 │ │ ├── num-iter v0.1.34 │ │ │ ├── num-integer v0.1.35 (*) │ │ │ └── num-traits v0.1.40 (*) │ │ └── num-traits v0.1.40 (*) │ └── time v0.1.38 │ └── libc v0.2.27 └── nom v3.2.0 └── memchr v1.0.1 └── libc v0.2.27 (*)

entonces, tanto para el caso bueno como para el malo, se usaron las mismas dependencias.

Si ejecuto cargo build -v -j1 , obtuve la línea de comando rustc para ambos casos.

La única diferencia para el caso bueno y malo es esta parte:

-L dependency=/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/target/debug/deps --extern chrono=/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/target/debug/deps/libchrono-8e9e54e691d9b988.rlib --extern nom=/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/target/debug/deps/libnom-b72336f662b090c1.rlib

el caso incorrecto tiene una ruta diferente a las bibliotecas y libnom-e2ec53418967eac0.rlib lugar de libnom-b72336f662b090c1.rlib , mientras que libchrono-8e9e54e691d9b988.rlib coincide.

Las cajas A y B son de origen cercano y no puedo reducir el problema a un caso más simple. Las cajas nom no se usan en A y B excepto a través de rust-nmea . rust-nmea se usa de manera simple, solo nmea = 0.0.6 Cargo.toml en Cargo.toml . Sin banderas o cosas así.

¿Alguna idea de por qué la dependencia de las cajas con los mismos pabellones (sin banderas) puede producir o no un error de sintaxis?


Encontré la fuente del problema, el cajón A tiene dependientes de segundo nivel con cexpr , cexpr tiene nom = {version = "^3", features = ["verbose-errors"] } en Cargo.toml , rust-nmea también dependen de nom , entonces tenemos error de tiempo de compilación.