【问题标题】:"linking with arm-linux-gnueabihf-gcc failed" when cross-compiling a Rust application from macOS to a Raspberry Pi 2将 Rust 应用程序从 macOS 交叉编译到 Raspberry Pi 2 时,“与 arm-linux-gnueabihf-gcc 的链接失败”
【发布时间】:2018-11-30 00:53:27
【问题描述】:

我想将我在 macOS 上的 Rust 应用程序交叉编译到 Raspberry Pi 2。我搜索了很多,但没有找到可行的解决方案。我尝试的最后一个解决方案是关注这个answer,但我无法让它工作。

  • macOS 版本:10.13.5 (High Sierra)
  • 锈蚀版本:1.11.0
  • 货运版本:1.26.0

我做了什么:

  • 我克隆了raspberrypi/tools
  • 已安装 arm-unknown-linux-gnueabihfarmv7-unknown-linux-gnueabihf 工具链通过 rustup
  • 在我的项目的根目录中创建了.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

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

【问题讨论】:

  • github.com/raspberrypi/tools 中的工具是为 Linux 编译的,只能在 Linux 上运行。您可能需要自己构建交叉编译器。
  • 我以前不知道,感谢您的澄清。所以基本上我需要为 Mac OS 编译 /arm-linux-gnueabihf-gcc 吗?然后使用我的个人编译版本作为链接器?所以也许可以使用crosstool-ng 之类的东西?

标签: macos raspberry-pi rust


【解决方案1】:

rust-std 库依赖于 glibc 来处理 syscalls 和其他低级内容,为了交叉编译 Rust 二进制文件,还需要存在适当的 C 工具链。这就是crosstool-NG 发挥作用的地方。

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

  • 将 repo 克隆到一个合适的位置并引导它:
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。运行:
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。

*** 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

  • 要使用新的交叉编译器构建 cargo,您必须:

    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. SCP 将您的文件传送到 RPi 并远程运行二进制文件:
scp target/armv7-unknown-linux-gnueabihf/debug/hello pi@192.168.1.43:
ssh pi@192.168.3.155 'chmod +x ~/hello && ~/hello'
Hello, world!

感谢Kappel Codes 我试图在这里总结一下,因为我在收到那篇文章前几个小时就发现了这个问题:)

【讨论】:

    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 2019-11-24
    • 2017-02-03
    • 1970-01-01
    • 2020-01-28
    • 2017-11-04
    • 2021-12-30
    相关资源
    最近更新 更多