跨编译时无法链接核心库

7

在 OS X 平台,目标为 i686-unknown-linux-gnu 的 Rust 无法链接到核心库,遇到了一些问题:

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
你是想明确,你有意从OS X交叉编译到Linux吗? - Shepmaster
我正在尝试进行交叉编译,以编写自己的玩具内核,基于此处的代码:https://github.com/charliesome/rustboot 我正在尝试让libcore编译通过。上面的代码是突出问题的最小代码。我将尝试使用./configure --target=i686-unknown-linux-gnu从源代码构建。 - zander
1个回答

13

这是由于您所针对的平台缺少核心库。有几种方式可以获取它:

  • 使用rustup——运行rustup target add i686-unknown-gnu-linux即可
  • 通过将core-nightly添加到您的Cargo.toml文件中,并使用cargo build --target=...,让cargo完成所有费力的工作。不幸的是,这个库好像已经有一段时间没有更新了,但是您可以通过从Rust仓库中复制src/libcore并添加一个Cargo.toml文件以及使用path依赖关系来创建一个本地包。在未来,它可能会通过crates.io进行官方提供,但我不知道这还有多久。
  • 为您想要的目标下载Rust构建(例如与您安装的版本相应的nightly版本),然后将lib/rustlib/目录解压到任何位置并手动搜索它(例如~/.multirust/toolchains/nightly-2015-01-18/lib/rustlib),或者将一个-L标志传递给编译器(但是我不确定-L标志应该指向的精确位置)。
  • 交叉编译Rust本身:检出仓库,运行./configure --target=$yourtarget,然后运行make会为您构建一种可以在当前计算机上运行并创建运行在所需目标上的二进制文件的编译器。
  • 手动交叉编译所需的crate,例如 zinc.rs 使用一个Rakefile 以构建他们所需的一切。
  • 目前来说,使用 Cargo 是最简单的方式。将来,交叉编译的过程肯定会更加容易,例如让multirust 对第三种可能性中的所有复杂部分进行处理。但是,第三种和第四种方式都依赖于能够在您的平台上构建std,这看起来对于内核工作并不可行。

    (顺便提一下,针对内核工作,rlibc crate 也是有用/必要的.)


    1
    搞定了!下载了夜间版并将 rustc-nightly-i686-unknown-linux-gnu/lib/rustlib/i686-unknown-linux-gnu 文件夹复制到 /usr/local/lib/rustlib,它链接成功了。感谢您的帮助。 - zander
    请参考在cargomultirust上提出的这些问题。 - Alister Lee
    将libcore放置的另一个位置是在$YOUR_PROJECT/.rust/lib/target.json/libcore.rlib,这样cargo就会很高兴。 - Theo Belaire
    @lilydjwg 嗯,来自不同目标的库仍然可以工作,只要它们是相同的编译器版本(即使用rustc 1.6进行交叉编译将需要使用其他1.6库)。 - huon
    @lilydjwg,如果用不同的提交构建,则下载的rustc与从源代码构建的rustc不一样。提交哈希是“真正”的编译器版本号(1.x.0版本仅适用于稳定版本:每个这些数字的夜间编译器有约45个构建)。让提交匹配,它就应该可以工作了(例如,只需下载两者即可)。 - huon
    显示剩余2条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接