【问题标题】:Cross-compiling Rust from Windows to ARM Linux从 Windows 到 ARM Linux 交叉编译 Rust
【发布时间】:2017-02-03 22:29:54
【问题描述】:

我使用的是 Windows 10。我想交叉编译一个 Rust 程序以在 armv7-unknown-linux-gnueabihf 上运行。 (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 真的不会让这变得更容易吗?

【问题讨论】:

  • arm cross compiler windows 执行互联网搜索似乎有许多有希望的线索,允许您下载预构建的编译器以用作链接器。你想在这里问什么问题?如果它是 rustup 的功能请求,也许在 repo 上做一个?有some chatter about semi-related aspects
  • 大部分结果都是针对嵌入式裸机 ARM GCC,它很容易以二进制形式 here 获得。那是arm-none-eabi-gcc(或其他东西;这些目标三元组非常随意)。
  • 对于通用打包的跨工具链,我会选择Linaro toolchain binaries。如果不清楚,您需要 i686_mingw32 一个。
  • 啊哈!出于某种原因,我不得不unzip it as admin,但在那之后它起作用了。顺便感谢 mingw32 的提示。

标签: windows gcc arm rust cross-compiling


【解决方案1】:

感谢@Notlikethat 的评论:

a) 是的,您需要提供自己的 GCC 交叉编译器。

b) 你可以获得一个here(选择一个mingw32 版本)。

只需解压缩 linaro 的 GCC,然后将货物指向它:

[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 库)。

【讨论】:

  • 链接在一定程度上确实依赖于 ISA,但主要是在浮点数据和一般架构配置文件(即 A 与 M)方面。也碰巧非裸机 Linaro 构建配置了 ARMv7(特别是 Cortex-A9)作为默认目标。
  • 啊,这很方便。谢谢!
【解决方案2】:

对于 MacOS 更好地使用:musleabihf,对于 Windows,您可以使用 gnueabihf,如下所示:

苹果机

$ 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");
}

我能把事情做好

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2022-11-04
    • 2011-08-04
    相关资源
    最近更新 更多