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.