我刚刚开始使用 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`.
您尝试链接的
.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
。