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

zan*_*der 6 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
Run Code Online (Sandbox Code Playgroud)

main.rs看起来像这样:

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

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

#[no_mangle]
#[no_split_stack]
pub fn main() {
}
Run Code Online (Sandbox Code Playgroud)

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

huo*_*uon 12

这是因为您所定位的平台不存在核心库.有几种方法可以获得它:

  • 使用rustup - rustup target add i686-unknown-gnu-linux应该做的伎俩
  • 通过添加到您的货物来获取所有的辛勤工作,并使用.不幸的是,它似乎还没有了一段时间更新,但可以通过复制在本地生成软件包出来的锈回购,添加和使用依赖; 在未来,它很可能也会通过crates.io正式提供,但我不知道这有多远.core-nightlyCargo.tomlcargo build --target=...src/libcoreCargo.tomlpath
  • 为你想要的目标下载一个Rust构建(例如每晚对应你已安装的目标),在lib/rustlib/某处自动搜索(~/.multirust/toolchains/nightly-2015-01-18/lib/rustlib)或在任何地方提取目录并将-L标志传递给编译器(我不是100%肯定的-L尽管如此,旗帜应指向的确切位置).
  • 交叉编译Rust本身:检查repo,./configure --target=$yourtarget然后make应该构建一个可以在当前计算机上运行的编译器,还可以创建在所需目标上运行的二进制文件
  • 做你需要的板条箱的手工交叉编译,例如锌.rs使用Rakefile构建他们想要的一切

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

(顺便说一句,rlibc crate对内核工作也很有用/必要.)