如何编译并分发用于自定义目标的Rust核心库?
自定义目标编译Rust core的相关问题解答
一、编译后的core库存放位置
- 默认情况下,执行
cargo build -Z build-std=core --target <你的自定义目标>后,核心库文件libcore.rlib会存放在rustup工具链的对应目录:
举个例子,若使用stable工具链,自定义目标名为~/.rustup/toolchains/<你的工具链ID>/lib/rustlib/<自定义目标名称>/lib/my-custom-target,路径就是~/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/my-custom-target/lib/libcore.rlib - 要是你用的是本地构建的非rustup管理工具链,编译产物会先出现在项目的
target/<自定义目标>/debug/deps/或release/deps/目录,之后也会被复制到工具链的rustlib目录下。 - 可以用这条命令精准定位路径:
cargo build -Z build-std=core --target <自定义目标> --message-format json | grep -o '"filenames":\[[^]]*\]' | grep -o '"[^"]*libcore.rlib"' | tr -d '"'
二、将预编译core用作其他项目的依赖
方法1:通过Cargo配置自动关联
- 确保自定义目标文件能被Cargo识别:
- 把目标JSON文件放到项目的
.cargo/目录,命名为<自定义目标>.json; - 或者复制到rustup工具链的
lib/rustlib/<自定义目标>/目录(前提是已经把core编译到该工具链)。
- 把目标JSON文件放到项目的
- 在目标项目的
.cargo/config.toml中添加配置:
这样Cargo会自动调用预编译好的core,不用重复编译。[build] target = "<你的自定义目标>" [unstable] build-std = ["core"]
方法2:手动指定预编译core路径
如果core不在默认工具链目录,可通过rustflags指定路径:
[build] target = "<你的自定义目标>" [target.<你的自定义目标>] rustflags = [ "-L", "/path/to/precompiled/core/lib", "--extern", "core=/path/to/precompiled/core/lib/libcore.rlib" ]
三、让rustc直接指向预编译core库
直接用rustc编译时,传递以下参数即可:
rustc --target <你的自定义目标> \ -L /path/to/precompiled/core/lib \ --extern core=/path/to/precompiled/core/lib/libcore.rlib \ your_code.rs
- 要是预编译core已经在rustup工具链的对应目标目录里,只需要指定
--target参数,rustc会自动从工具链的rustlib目录查找:rustc --target <你的自定义目标> your_code.rs - 也可以设置环境变量简化命令:
export RUSTFLAGS="-L /path/to/precompiled/core/lib --extern core=/path/to/precompiled/core/lib/libcore.rlib" rustc --target <你的自定义目标> your_code.rs
内容的提问来源于stack exchange,提问作者ARK
相关产品推荐
相关产品推荐

