【问题标题】:Cannot link against core library when cross compiling交叉编译时无法链接核心库
【发布时间】:2015-03-17 21:10:18
【问题描述】:

在让 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 但该平台不存在核心库。您如何为该平台安装或构建库?

【问题讨论】:

  • 说清楚,您是故意尝试从 OS X 交叉编译到 Linux?
  • 我正在尝试交叉编译以编写我自己的玩具内核,基于此处的代码:github.com/charliesome/rustboot 我正在尝试让 libcore 进行编译。上面的代码是突出问题的最小代码。我将尝试使用 ./configure --target=i686-unknown-linux-gnu 从源代码构建

标签: cross-compiling rust


【解决方案1】:

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

  • 使用rustuprustup target add i686-unknown-gnu-linux 应该可以解决问题
  • 通过将core-nightly 添加到您的Cargo.toml 并使用cargo build --target=... 来获取cargo 来完成所有艰苦的工作。不幸的是,它似乎已经有一段时间没有更新了,但是可以通过从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 应该为您构建一个可以在您当前计算机上运行的编译器,但也可以创建在您想要的目标上运行的二进制文件
  • 对您需要的 crate 进行手动交叉编译,例如zinc.rs 使用 Rakefile 构建他们想要的一切

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

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

【讨论】:

  • 搞定了!下载 nightly 并将 rustc-nightly-i686-unknown-linux-gnu/lib/rustlib/i686-unknown-linux-gnu 文件夹复制到 /usr/local/lib/rustlib 并链接。感谢您的帮助。
  • 另见cargomultirust提出的这些问题
  • 另外一个放libcore的地方在$YOUR_PROJECT/.rust/lib/target.json/libcore.rlib,cargo会很开心的。
  • 其他版本的 rustlib 似乎不再工作了。
  • @lilydjwg 嗯,来自不同目标的库应该仍然可以工作,只要它们是相同的编译器版本(即与 rustc 1.6 交叉编译将需要使用其他 1.6 库)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
相关资源
最近更新 更多