将 Rust 从 Windows 交叉编译到 ARM Linux
Cross-compiling Rust from Windows to ARM Linux
我正在使用 Windows 10。我想在 armv7-unknown-linux-gnueabihf
上将 Rust 程序交叉编译为 运行。 (armv7-unknown-linux-muscl
也可以,但好像没有。)
这是我的步骤:
- 安装
rustup
rustup toolchain install stable-x86_64-pc-windows-gnu
rustup toolchain default stable-x86_64-pc-windows-gnu
rustup target add armv7-unknown-linux-gnueabihf
编辑我的 ./cargo/config
文件以包含:
[build]
target = "armv7-unknown-linux-gnueabihf"
cargo build
编译一切正常,但在链接时出现此错误:
error: could not exec the linker `cc`: The system cannot find the file specified. (os error 2)
据我所知,这是因为 Rust 没有自己的链接器,而是使用 GCC。显然我需要自己提供这个并将其添加到 ./cargo/config
文件中:
[target.armv7-unknown-linux-gnueabihf]
linker = "c:/path/to/my/gcc/cross/compiler"
是吗?如果是这样的话,我到底在哪里可以为 Windows 下载这样的交叉编译器,为什么 rustup
不安装它?必须自己编译 GCC 的交叉编译版本是交叉编译 C/C++ 程序的最大痛苦。 Rustup 真的不会让这更容易吗?
感谢@Notlikethat 的评论:
a) 是的,您需要提供自己的 GCC 交叉编译器。
b) 你可以获得一个 here(select 一个 mingw32
版本)。
只需解压 linaro 的 GCC,然后将 cargo 指向它:
[target.armv7-unknown-linux-gnueabihf]
linker = "C:/Users/me/gcc-linaro-5.3.1-2016.05-i686-mingw32_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc.exe"
即使它是 arm-
而不是 armv7-
,它似乎也能工作。我想链接不依赖于 ISA。实际上我还没有运行,但它构建没有错误!
编辑:
您现在可以改用 armv7-unknown-linux-musleabihf
并获得实际可移植的二进制文件(即它不依赖于经常导致兼容性问题的 GNU C 库)。
对于MacOS,更好地使用:musleabihf
,对于Windows,您可以使用gnueabihf
,如下所示:
Mac
$ brew install arm-linux-gnueabihf-binutils
$ rustup target add armv7-unknown-linux-musleabihf
在.cargo/config
[build]
target = "armv7-unknown-linux-musleabihf"
[target.armv7-unknown-linux-c]
linker = "arm-linux-gnueabihf-ld"
简单src/main.rs
fn main() {
println!("Hello, Raspberry!");
}
那就没问题了:
Hasans-Air:rpi hasan$ cargo build
Compiling rpi v0.1.0 (/Users/hasan/PycharmProjects/rpi)
Finished dev [unoptimized + debuginfo] target(s) in 0.41s
Hasans-Air:rpi hasan$ scp target/armv7-unknown-linux-musleabihf/debug/rpi pi@192.168.1.43:
pi@192.168.1.43's password:
rpi 100% 2702KB 2.6MB/s 00:01
Hasans-Air:rpi hasan$ ssh pi@192.168.1.43 'chmod +x ~/rpi && ~/rpi'
pi@192.168.1.43's password:
Hello, Raspberry!
赢 10
从 here 和 运行:
获取链接器
rustup target add armv7-unknown-linux-gnueabihf
正在创建文件 .cargo/config
,内容为:
[build]
target = "armv7-unknown-linux-gnueabihf"
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
简单 src/main.rs
:
fn main() {
println!("Hello, Raspberry! from Win 10");
}
我能够完成任务
我正在使用 Windows 10。我想在 armv7-unknown-linux-gnueabihf
上将 Rust 程序交叉编译为 运行。 (armv7-unknown-linux-muscl
也可以,但好像没有。)
这是我的步骤:
- 安装
rustup
rustup toolchain install stable-x86_64-pc-windows-gnu
rustup toolchain default stable-x86_64-pc-windows-gnu
rustup target add armv7-unknown-linux-gnueabihf
编辑我的
./cargo/config
文件以包含:[build] target = "armv7-unknown-linux-gnueabihf"
cargo build
编译一切正常,但在链接时出现此错误:
error: could not exec the linker `cc`: The system cannot find the file specified. (os error 2)
据我所知,这是因为 Rust 没有自己的链接器,而是使用 GCC。显然我需要自己提供这个并将其添加到 ./cargo/config
文件中:
[target.armv7-unknown-linux-gnueabihf]
linker = "c:/path/to/my/gcc/cross/compiler"
是吗?如果是这样的话,我到底在哪里可以为 Windows 下载这样的交叉编译器,为什么 rustup
不安装它?必须自己编译 GCC 的交叉编译版本是交叉编译 C/C++ 程序的最大痛苦。 Rustup 真的不会让这更容易吗?
感谢@Notlikethat 的评论:
a) 是的,您需要提供自己的 GCC 交叉编译器。
b) 你可以获得一个 here(select 一个 mingw32
版本)。
只需解压 linaro 的 GCC,然后将 cargo 指向它:
[target.armv7-unknown-linux-gnueabihf]
linker = "C:/Users/me/gcc-linaro-5.3.1-2016.05-i686-mingw32_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc.exe"
即使它是 arm-
而不是 armv7-
,它似乎也能工作。我想链接不依赖于 ISA。实际上我还没有运行,但它构建没有错误!
编辑:
您现在可以改用 armv7-unknown-linux-musleabihf
并获得实际可移植的二进制文件(即它不依赖于经常导致兼容性问题的 GNU C 库)。
对于MacOS,更好地使用:musleabihf
,对于Windows,您可以使用gnueabihf
,如下所示:
Mac
$ brew install arm-linux-gnueabihf-binutils
$ rustup target add armv7-unknown-linux-musleabihf
在.cargo/config
[build]
target = "armv7-unknown-linux-musleabihf"
[target.armv7-unknown-linux-c]
linker = "arm-linux-gnueabihf-ld"
简单src/main.rs
fn main() {
println!("Hello, Raspberry!");
}
那就没问题了:
Hasans-Air:rpi hasan$ cargo build
Compiling rpi v0.1.0 (/Users/hasan/PycharmProjects/rpi)
Finished dev [unoptimized + debuginfo] target(s) in 0.41s
Hasans-Air:rpi hasan$ scp target/armv7-unknown-linux-musleabihf/debug/rpi pi@192.168.1.43:
pi@192.168.1.43's password:
rpi 100% 2702KB 2.6MB/s 00:01
Hasans-Air:rpi hasan$ ssh pi@192.168.1.43 'chmod +x ~/rpi && ~/rpi'
pi@192.168.1.43's password:
Hello, Raspberry!
赢 10 从 here 和 运行:
获取链接器rustup target add armv7-unknown-linux-gnueabihf
正在创建文件 .cargo/config
,内容为:
[build]
target = "armv7-unknown-linux-gnueabihf"
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
简单 src/main.rs
:
fn main() {
println!("Hello, Raspberry! from Win 10");
}
我能够完成任务