交叉编译时无法 link 针对核心库

Cannot link against core library when cross compiling

在 OS X 上将 Rust link 引入核心库时遇到一些问题 targeting i686-unknown-linux-gnu:

MacBook:rustboot alex$ make
rustc -O --target i686-unknown-linux-gnu --crate-type lib -o main.o --emit obj main.rs
main.rs:5:1: 5:19 error: can't find crate for `core`
main.rs:5 extern crate core;
          ^~~~~~~~~~~~~~~~~~
error: aborting due to previous error
make: *** [main.o] Error 101

main.rs 看起来像这样:

#![no_std]
#![allow(ctypes)]
#![feature(lang_items)]

extern crate core;
use core::prelude::*;

#[no_mangle]
#[no_split_stack]
pub fn main() {
}

我怀疑这是因为我正在尝试 link 到 i686-unknown-linux-gnu 但该平台不存在核心库。您如何为该平台安装或构建库?

这是因为您的目标平台不存在核心库。有几种方法可以获得它:

  • 使用 rustuprustup target add i686-unknown-gnu-linux 应该可以解决问题
  • 获取cargo to do all the hard work by adding core-nightly to your Cargo.toml, and use cargo build --target=.... Unfortunately it seems it hasn't been updated for a while, but one can make a local package by copying src/libcore out of the Rust repo,添加Cargo.toml并使用path依赖;以后估计也会通过crates.io官方提供,但不知道还有多远
  • 为您想要的目标下载一个 Rust 版本(例如 corresponding nightly 到您已经安装的那个),将 lib/rustlib/ 目录解压到自动搜索的某个地方(~/.multirust/toolchains/nightly-2015-01-18/lib/rustlib),或者任何地方并将 -L 标志传递给编译器(不过,我不是 100% 确定 -L 标志应该指向的精确位置)。
  • 交叉编译 Rust 本身:检查回购协议,./configure --target=$yourtarget 然后 make 应该为您构建一个可以 运行 在您当前计算机上的编译器,而且还创建二进制文件 运行 在你想要的目标上
  • 手动交叉编译你需要的包,例如zinc.rs uses a Rakefile 构建他们想要的一切

货运航线目前绝对是最简单的。交叉编译的故事将来肯定会变得更容易,例如让 multirust 为第三种可能性做所有复杂的工作。但是,第三种和第四种方法都依赖于能够为您的平台构建 std,这对于内核工作似乎不太可能。

(顺便说一句,rlibc crate 也是 useful/necessary 用于内核工作。)