代码之家  ›  专栏  ›  技术社区  ›  Paul C

当库名称与包名称不同时,如何导入板条箱依赖项?

  •  5
  • Paul C  · 技术社区  · 7 年前

    我有一个板条箱是直接从GitHub进口的,根据货物的 documentation

    [dependencies]
    libfoo = { git = "ssh://git@github.com/me/libfoo", branch = "dev" }
    
    [lib]
    path = "src/rust/lib.rs"
    name = "myprj"
    crate-type = ["cdylib"]
    

    跑步 cargo build libfoo 并在 ~/.cargo 目录当我尝试在中使用(导入)它时 lib.rs

    extern crate libfoo;   //also tried foo
    

    error[E0463]: can't find crate for `libfoo`
     --> src/rust/lib.rs:1:1
      |
    1 | extern crate libfoo;
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't find crate
    

    有趣的是,当我在中点击它时,IntelliJ的Rust插件确实找到了板条箱 lib.rs ~/.货物 ...

    利福 这个 lib 第节 Cargo.toml 文件指定为:

    [package]
    name = "libfoo"
    [lib]
    name = "foo"
    crate-type = ["cdylib"]
    

    我尝试了libfoo和foo的所有排列,以查看Cargo是否在lib名称和包/目录名称之间混淆。

    如果我指定依赖项的本地路径,它也会失败。(Cargo编译依赖项,但在中声明/导入时声称找不到它 lib.rs

    [dependencies]
    libfoo = { path = "/Users/me/dev/libfoo" }
    

    如果我包括一个来自git的板条箱或具有相同内容的文件系统 [lib] [package] name,很好用。看来问题出在有图书馆的板条箱上( [lib] [包装]

    如果我删除 [lib] 依赖项的 货物.toml

    使现代化 :如果 crate-type = ["cdylib"] 已从中删除 ,这适用于 foo 已导入。如果存在,我会得到相同的错误 extern crate foo;

    1 回复  |  直到 7 年前
        1
  •  10
  •   Francis Gagné    7 年前

    货物感兴趣 当涉及到依赖项时,编译器( rustc 库名称

    让我们再看看这个 Cargo.toml 摘录:

    [package]
    name = "libfoo"
    
    [lib]
    name = "foo"
    

    在这里 包名称 libfoo foo .

    ( 利福 )在 [dependencies]

    [dependencies]
    libfoo = { git = "ssh://git@github.com/me/libfoo", branch = "dev" }
    

    这是你已经拥有的,而且是正确的。

    但是,当您想在板条箱中导入库时,需要编写 extern crate 项目,即。

    extern crate foo;
    

    利福 在两者中 货物.toml 项目,如您所述。当我跑的时候 cargo build 利福 成功构建,表明Cargo正确解决了依赖关系。但我也注意到编译器找不到 利福 ,正如您所经历的。

    rustc公司 cargo build --verbose .这是我看到的(不相关部分省略):

    Running `rustc [...] --extern foo=/[path]/target/debug/deps/libfoo-5cf876c5c8ac1bfb.rlib`                                                                 
    

    --extern name=path 参数说明 rustc公司 板条箱上写着 name 位于 path .这里的名字是 ,所以我们必须写 extern crate foo;