将 Rust 应用程序从 macOS 交叉编译到 Raspberry Pi 2 时,“与arm-linux-gnueabihf-gcc 链接失败”

2024-05-01

我想将 macOS 上的 Rust 应用程序交叉编译到 Raspberry Pi 2。我进行了很多搜索,但没有找到可行的解决方案。我尝试的最后一个解决方案是遵循这个answer https://stackoverflow.com/questions/29917513/how-can-i-compile-rust-code-to-run-on-a-raspberry-pi-2,但我无法让它发挥作用。

  • macOS 版本:10.13.5(High Sierra)
  • rustup 版本:1.11.0
  • 货物版本:1.26.0

我做了什么:

  • 我克隆了树莓派/工具 https://github.com/raspberrypi/tools
  • 已安装ARM-未知-Linux-gnueabihf and armv7-未知-linux-gnueabihf通过 rustup 的工具链
  • Created .cargo/config文件位于我的项目的根目录中,内容如下

    [target.armv-unknown-linux-gnueabihf]
    linker = "/Users/user/Documents/Programming/RustProjects/hello-pi/../../Utils/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc"
    
  • 然后我跑cargo build --target=arm-unknown-linux-gnueabihf

我收到以下错误:

linking with /Users/user/Documents/Programming/RustProjects/hello-pi/../../Utils/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc failed: exit code: 126
....
cannot execute binary file

看来我无法运行...gcc我的 macOS 机器上的二进制文件。将 Rust 应用程序从 macOS 交叉编译到 Raspberry Pi 2 的 ARM 架构的正确方法是什么?


rust-std库依赖于glibc对于像这样的事情syscalls和其他低级内容,为了交叉编译 Rust 二进制文件,还需要适当的 C 工具链。这就是地方交叉工具-NG http://crosstool-ng.github.io/docs/introduction/发挥作用。

crosstool-NG从事工具链构建业务。您将使用它为自己构建一个工具链,用于链接 ARMv7 兼容的glibc,这将使您能够成功为 Pi 构建 Rust 二进制文件。

  • 将存储库克隆到一个合适的位置并引导它:
cd /Users/USER
git clone https://github.com/crosstool-ng/crosstool-ng
cd crosstool-ng
./bootstrap
  • 配置安装并运行它。要设置该工具的安装位置,请运行:
./configure --prefix=$PWD
make
make install
export PATH="${PATH}:${PWD}/bin"

如果一切按预期进行,您应该能够运行ct-ng version并验证该工具是否已准备就绪。

  • 配置工具来构建您的ARMv7 toolchain。幸运的是,crosstool-NG 带有一些预设配置,即armv7-rpi2-linux-gnueabihf. Run:
ct-ng armv7-rpi2-linux-gnueabihf

应该有一些输出表明它现在已配置为armv7-rpi2-linux-gnueabihf。你只需要告诉 ct-ng 工具链应该去哪里:

mkdir /Users/USER/ct-ng-toolchains
cd /Users/USER/ct-ng-toolchains
ct-ng menuconfig

这可能会让人不知所措,因为有很多选择,但要坚持Paths and misc options ---> menu option。突出显示它并按 Enter 键。

Under *** crosstool-NG behavior ***,向下滚动直到看到这个长字符串:(${CT_PREFIX:-${HOME}/x-tools}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}) Prefix directory- 按 Enter 键,删除内容,并将其替换为/Users/USER/ct-ng-toolchains。 - 完成后,按 Enter 键确认,滚动并保存,然后退出配置器。

  • 构建您的工具链(这可能需要半小时):
ct-ng build
  • 如果成功的话,您现在应该会看到很多二进制文件/Users/USER/ct-ng-toolchains/armv7-rpi2-linux-gnueabihf/bin,即armv7-rpi2-linux-gnueabihf-gcc.

  • 对于使用新的交叉编译器构建的货物,您必须:

    1. 将上面列出的 bin 文件夹添加到您的 PATH 中:
export PATH="${PATH}:/Users/USER/ct-ng-toolchains/armv7-rpi2-linux-gnueabihf/bin"
  1. 更新(或创建)您的全局/Users/USER/.cargo/config文件(您可以避免这种情况并在本地使用它.cargo/config):
[target.armv7-unknown-linux-gnueabihf]
linker = "armv7-rpi2-linux-gnueabihf-gcc"

3.返回您的 Rust 项目并重新运行 Cargo build:

cd /Users/USER/rust/hello
cargo build --target=armv7-unknown-linux-gnueabihf
  1. 输出应该类似于:
   Compiling hello v0.1.0 (file:///Users/USER/rust/hello)
    Finished dev [unoptimized + debuginfo] target(s) in 0.85 secs
  1. 将您的文件发送到 RPi 并远程运行二进制文件:
scp target/armv7-unknown-linux-gnueabihf/debug/hello [email protected] /cdn-cgi/l/email-protection:
ssh [email protected] /cdn-cgi/l/email-protection 'chmod +x ~/hello && ~/hello'
Hello, world!

信用去往卡佩尔代码 https://akappel.github.io/2017/11/07/rpi-crosstool.html我试图在这里总结一下,因为我在收到那篇文章之前几个小时就发现了这个问题:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Rust 应用程序从 macOS 交叉编译到 Raspberry Pi 2 时,“与arm-linux-gnueabihf-gcc 链接失败” 的相关文章

随机推荐