从Windows到ARM Linux的交叉编译Rust

15

我正在使用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的功能请求,或许可以在库的存储库上创建一个请求?关于半相关方面也有一些交流。详见: https://github.com/rust-lang-nursery/rustup.rs/issues/486。 - Shepmaster
大多数结果都是针对嵌入式裸机ARM GCC的,这在二进制形式上很容易获得(此处)。也就是arm-none-eabi-gcc(或者其他什么;这些目标三元组非常任意)。 - Timmmm
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Notlikethat
啊哈!由于某些原因,我不得不以管理员身份解压缩它,但之后它可以正常工作了。顺便感谢mingw32提示。 - Timmmm
2个回答

12

感谢@Notlikethat的评论:

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

b) 您可以从这里获取一个(选择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库,这经常导致兼容性问题)。


2
链接在某种程度上取决于ISA,但主要是针对浮点运算和一般架构配置(即A vs. M)。另外,非裸机Linaro构建的默认目标通常配置为ARMv7(特别是Cortex-A9)。 - Notlikethat
啊,那很方便。谢谢! - Timmmm

8

如果你使用的是Mac系统,最好使用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!

Win 10此处获取链接器,然后运行:

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

我能够完成任务。 enter image description here enter image description here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接