4

我有A依赖BB依赖于rust-nmea板条箱的板条箱。

如果我构建板条箱,我在构建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;`

但是如果我去Bcrate 的源代码树并运行cargo build,所有构建都没有任何错误(如果你跟着我A依赖BB依赖rust-nmea),

如果转到/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 (*)

并由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 (*)

因此,无论好坏,都使用相同的依赖项。

如果运行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

bad case 有不同的库路径,而libnom-e2ec53418967eac0.rlib不是libnom-b72336f662b090c1.rlib, whilelibchrono-8e9e54e691d9b988.rlib匹配。

板条箱AB来源密切,我无法将问题简化为更简单的情况。nom crates 未在 rust-nmea 中使用AB但通过rust-nmea除外。 rust-nmea的使用方式很简单,就nmea = 0.0.6Cargo.toml. 没有旗帜之类的东西。

知道为什么具有相同标志(根本没有标志)的 crate 依赖可能会产生或不产生语法错误吗?

4

1 回答 1

2

我找到了问题的根源,crateA有二级依赖, 有cexprcexprnom = {version = "^3", features = ["verbose-errors"] },也有依赖,所以我们有编译时错误。Cargo.tomlrust-nmeanom

于 2017-07-24T17:28:23.697 回答