我用的是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. 编辑my ./cargo/config文件以包含:

    [build]
    target = "armv7-unknown-linux-gnueabihf"
    
  6. 一百

这可以很好地编译所有内容,但在链接时会出现以下错误:

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++程序的最大痛苦.Rustop真的没有让这变得更容易吗?

推荐答案

感谢@Notlikethat的 comments :

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.实际上我还没有运行它,但它构建时没有错误!

Edit:

你现在可以用armv7-unknown-linux-musleabihf来代替,得到一个真正可移植的二进制文件(也就是说,它不依赖于GNU C库,这通常会导致兼容性问题).

Rust相关问答推荐

为什么实例方法可以像Rust中的静态方法一样被调用?

字段类型为Boxed的 struct 的生存期必须超过static

Windows 上 ndarray-linalg 与 mkl-stats 的链接时间错误

Rust 如何返回大类型(优化前)?

返回优化后的标题:返回异步块的闭包的类型擦除

Rust 程序中的内存泄漏

max(ctz(x), ctz(y)) 有更快的算法吗?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

Rust Redis 中的 HSET 命令问题

错误:将自定义 proc_macro 与用Rust 的宝贝编写的属性一起使用时,无法在此范围内找到属性

`移动||异步移动{...}`,如何知道哪个移动正在移动哪个?

在运行时在 Rust 中加载字体

如何获取函数中borrow 的切片的第一部分?

Rust 将特性传递给依赖项

为什么指定生命周期让我返回一个引用?

Rust,使用枚举从 HashMap 获取值

通用函数中的生命周期扣除和borrow (通用测试需要)

相互调用的递归异步函数:检测到循环

类型参数不受 impl 特征、自身类型或谓词的约束

为什么可以从不可变 struct 的字段中移动?