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

时间:2018-06-20 19:37:01

标签: macos raspberry-pi rust

我想将macOS上的Rust应用程序交叉编译为Raspberry Pi2。我进行了很多搜索,但没有找到可行的解决方案。我尝试的最后一个解决方案是遵循此answer,但是我无法使其正常工作。

  • macOS版本:10.13.5(High Sierra)
  • 启动版本:1.11.0
  • 货运版本:1.26.0

我做了什么:

  • 我克隆了raspberrypi/tools
  • 安装了 arm-unknown-linux-gnueabihf 和 通过rustup armv7-unknown-linux-gnueabihf 工具链
  • 在我的项目的根目录中创建了.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体系结构的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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。运行:
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

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

    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项目并重新运行货物构建:

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,我试图在这里进行总结,因为我在获得这篇文章的几小时前就发现了这个问题:)