交叉编译时无法链接核心库

时间:2015-01-19 19:05:35

标签: cross-compiling rust

让Rust连接到OS X上针对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() {
}

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

1 个答案:

答案 0 :(得分:10)

这是由您所定位的平台不存在的核心库造成的。有一些方法可以获得它:

  • 使用rustup - rustup target add i686-unknown-gnu-linux应该诀窍
  • 通过将cargo添加到Cargo.toml并使用cargo build --target=...,让core-nightly完成所有艰苦工作。不幸的是,它似乎暂时没有更新,但可以通过从the Rust repo复制src/libcore,添加Cargo.toml并使用path来制作本地包依赖;在将来,它很可能也会通过crates.io正式提供,但我不知道这有多远。
  • 为您想要的目标下载一个Rust构建(例如corresponding nightly到您已安装的目标),在某处自动搜索(lib/rustlib/)或在任何地方提取~/.multirust/toolchains/nightly-2015-01-18/lib/rustlib目录。将-L标志传递给编译器(我不是100%确定-L标志应指向的确切位置。)
  • 交叉编译Rust本身:检查repo,./configure --target=$yourtarget然后make应该构建一个可以在当前计算机上运行的编译器,还可以创建在所需目标上运行的二进制文件
  • 手动交叉编译您需要的包装箱,例如: zinc.rs使用构建他们想要的所有内容的Rakefile

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

(顺便说一下,rlibc包也是内核工作所必需的。)