货物构建相同的代码:虚假的编译时间错误?

时间:2017-07-24 13:09:42

标签: rust rust-cargo rust-crates

我的箱子certmgr.exe -add MyCert.cer -s -r localMachine root 取决于AB取决于rust-nmea箱子。

如果我构建crate B,我会在构建rust-nmea依赖项时遇到一堆错误(所有这些错误A}:

use std::error::Error;

但是如果我去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;` crate的源代码树并运行B, 所有构建都没有任何错误(如果您关注我cargo build取决于AB取决于rust-nmea),

如果转到B(参见编译错误)并运行/home/evgeniy/.cargo/registry/src/github.com-1ecc6299db9ec823/nmea-0.0.6/那么一切都很好。

cargo build的货物树展示:

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 (*) rust-nmea缓存:

cargo

所以对于好的和坏的情况都使用相同的依赖。

如果运行├── 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 (*) ,我会在两种情况下都获得cargo build -v -j1命令行。

好的和坏的情况的唯一区别是这部分:

rustc

不良案例与库有-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 而不是libnom-e2ec53418967eac0.rlib的路径不同,而libnom-b72336f662b090c1.rlib匹配。

条件箱libchrono-8e9e54e691d9b988.rlibA来源紧密,我无法将问题简化为更简单的案例。除了nom之外,BA中未使用rust-nmea个条箱。 rust-nmea以简单的方式使用,仅B中的nmea = 0.0.6。 没有旗帜等等。

任何想法为什么箱子依赖相同的旗帜(根本没有旗帜) 可能产生或不产生语法错误?

1 个答案:

答案 0 :(得分:2)

我找到问题的根源, crate A具有cexpr的二级依赖项, cexpr nom = {version = "^3", features = ["verbose-errors"] }中有Cargo.tomlrust-nmea也依赖于nom,因此我们有编译时错误。