rustc -L 命令找不到箱子

问题描述 投票:0回答:1

我刚刚开始使用 Rust。我已经用 Cargo 安装了 rust,随后安装了一些软件包,所以现在

~/.cargo/registry/cache/github.com-1ecc6299db9ec823
文件夹有很多板条箱:

aho-corasick-0.5.3.crate   env_logger-0.4.3.crate    open-1.2.2.crate           regex-0.1.80.crate            textwrap-0.11.0.crate
aho-corasick-0.6.10.crate  gcc-0.3.55.crate          rand-0.3.23.crate          regex-0.2.11.crate            thread-id-2.0.0.crate
aho-corasick-0.7.3.crate   getrandom-0.1.2.crate     rand-0.4.6.crate           regex-1.1.6.crate             thread_local-0.2.7.crate
ansi_term-0.11.0.crate     hoedown-6.0.0.crate       rand-0.6.5.crate           regex-syntax-0.3.9.crate      thread_local-0.3.6.crate
atty-0.2.11.crate          itertools-0.5.10.crate    rand_chacha-0.1.1.crate    regex-syntax-0.5.6.crate      time-0.1.42.crate
autocfg-0.1.2.crate        kernel32-sys-0.2.2.crate  rand_core-0.3.1.crate      regex-syntax-0.6.6.crate      toml-0.2.1.crate
bitflags-0.5.0.crate       lazy_static-0.2.11.crate  rand_core-0.4.0.crate      rustc-serialize-0.3.24.crate  ucd-util-0.1.3.crate
bitflags-1.0.4.crate       lazy_static-1.3.0.crate   rand_hc-0.1.0.crate        rustc_version-0.1.7.crate     unicode-width-0.1.5.crate
cargo-script-0.2.8.crate   libc-0.2.51.crate         rand_isaac-0.1.1.crate     semver-0.1.20.crate           utf8-ranges-0.1.3.crate
cfg-if-0.1.7.crate         log-0.3.9.crate           rand_jitter-0.1.3.crate    semver-0.5.1.crate            utf8-ranges-1.0.2.crate
chan-0.1.23.crate          log-0.4.6.crate           rand_os-0.1.3.crate        semver-parser-0.6.2.crate     vec_map-0.8.1.crate
clap-2.33.0.crate          memchr-0.1.11.crate       rand_pcg-0.1.2.crate       shaman-0.1.0.crate            winapi-0.2.8.crate
either-1.5.2.crate         memchr-2.2.0.crate        rand_xorshift-0.1.1.crate  strsim-0.8.0.crate            winapi-build-0.1.1.crate

我现在想使用带有 -L 选项的 rustc 命令来获取来自here的简单源文件:

extern crate regex;
use regex::Regex;
fn main() {
    let re = Regex::new(r"^\d{4}-\d{2}-\d{2}$").unwrap();
    println!("Did our date match? {}", re.is_match("2014-01-01"));
}

但是,这会失败并出现以下错误:

$ rustc -L ~/.cargo/registry/cache/github.com-1ecc6299db9ec823 hellomain.rs 
error[E0463]: can't find crate for `regex`
 --> hellomain.rs:4:1
  |
4 | extern crate regex;
  | ^^^^^^^^^^^^^^^^^^^ can't find crate

error: aborting due to previous error

For more information about this error, try `rustc --explain E0463`.

为什么 rustc 找不到 crate,如何纠正?感谢您的帮助。

编辑:即使我指定板条箱文件名也会发生相同的错误:

$ rustc -L ~/.cargo/registry/cache/github.com-1ecc6299db9ec823/regex-1.1.6.crate hellomain.rs
error[E0463]: can't find crate for `regex`
 --> hellomain.rs:4:1
  |
4 | extern crate regex;
  | ^^^^^^^^^^^^^^^^^^^ can't find crate

error: aborting due to previous error

For more information about this error, try `rustc --explain E0463`.
rust rust-cargo
1个回答
0
投票

您尝试链接的

.crate
文件不是已编译的二进制工件。其格式(据我所知)只是板条箱源代码的
.gz
。它是
cargo package
的输出格式。此外,
-L
标志通常用于库目录,
-l
用于链接特定的库(尽管您将在下面看到
rustc
使用
--extern
来表示 Rust 依赖项)。

为了使用正则表达式板条箱,必须首先构建它。然而到目前为止,它还需要另外两个板条箱,

regex_syntax
regex_automata
,需要首先构建。每个都需要单独调用
rustc
,相互构建,直到您最终可以构建可执行文件。

以下是所有这些命令(使用

./deps
作为构建缓存):

rustc --out-dir ./deps --crate-type lib --emit=metadata,link --crate-name regex_syntax --edition=2021 ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-syntax-0.8.4/src/lib.rs
rustc --out-dir ./deps --crate-type lib --emit=metadata,link --crate-name regex_automata --edition=2021 ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-automata-0.4.7/src/lib.rs --cfg 'feature="alloc"' --cfg 'feature="meta"' --cfg 'feature="nfa-pikevm"' --cfg 'feature="nfa-thompson"' --cfg 'feature="syntax"' -L dependency=./deps --extern regex_syntax=./deps/libregex_syntax.rmeta
rustc --out-dir ./deps --crate-type lib --emit=metadata,link --crate-name regex --edition=2021 ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/regex-1.10.5/src/lib.rs -L dependency=./deps --extern regex_automata=./deps/libregex_automata.rmeta --extern regex_syntax=./deps/libregex_syntax.rmeta
rustc --out-dir ./deps --crate-type bin --emit=link --crate-name mycrate --edition=2021 src/main.rs -L dependency=./deps --extern regex=./deps/libregex.rlib

这实际上并没有成功运行您的代码,因为我没有包含正则表达式板条箱默认启用的17个功能标志

手动运行

rustc
命令假定源已经在
~/.cargo/registry
中的某个位置可用。这也没有指定优化标志或代码生成选项。这忽略了生成调试信息。如果需要构建和链接同一个包的两个版本,这也无法处理冲突。这也需要你自己去理解和传播特性统一。这也忽略了一些 crate 所依赖的编译期间由 Cargo 传递的所有环境变量。

这显然会变得更加复杂,因为您依赖更多的板条箱,如果有构建脚本,情况会更糟。您可以使用

cargo build -vv
查看正常生成的命令。只需使用
cargo

© www.soinside.com 2019 - 2024. All rights reserved.