交叉编译时无法 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 但该平台不存在核心库。您如何为该平台安装或构建库?
这是因为您的目标平台不存在核心库。有几种方法可以获得它:
- 使用 rustup —
rustup 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 用于内核工作。)
在 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 但该平台不存在核心库。您如何为该平台安装或构建库?
这是因为您的目标平台不存在核心库。有几种方法可以获得它:
- 使用 rustup —
rustup target add i686-unknown-gnu-linux
应该可以解决问题 - 获取cargo to do all the hard work by adding
core-nightly
to yourCargo.toml
, and usecargo build --target=...
. Unfortunately it seems it hasn't been updated for a while, but one can make a local package by copyingsrc/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 用于内核工作。)