将 Rust 从 Windows 交叉编译到 ARM Linux

Cross-compiling Rust from Windows to ARM Linux

我正在使用 Windows 10。我想在 armv7-unknown-linux-gnueabihf 上将 Rust 程序交叉编译为 运行。 (armv7-unknown-linux-muscl也可以,但好像没有。)

这是我的步骤:

  1. 安装rustup
  2. rustup toolchain install stable-x86_64-pc-windows-gnu
  3. rustup toolchain default stable-x86_64-pc-windows-gnu
  4. rustup target add armv7-unknown-linux-gnueabihf
  5. 编辑我的 ./cargo/config 文件以包含:

    [build]
    target = "armv7-unknown-linux-gnueabihf"
    
  6. 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!

赢 10here 和 运行:

获取链接器
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");
}

我能够完成任务