当前位置: 首页 > 知识库问答 >
问题:

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

仰成天
2023-03-14

我想将macOS上的Rust应用程序交叉编译为Raspberry PI2。我找了很多,但没有找到一个可行的解决办法。我尝试的最后一个解决方案是遵循这个答案,但我无法让它工作。

    null
[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"
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 PI2的ARM架构的正确方法是什么?

共有1个答案

姬旭
2023-03-14

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工具链。幸运的是,crosstool-NG附带了一些预置配置,即armv7-rpi2-linux-gnueabihf。运行:
ct-ng armv7-rpi2-linux-gnueabihf
mkdir /Users/USER/ct-ng-toolchains
cd /Users/USER/ct-ng-toolchains
ct-ng menuconfig
  • 构建工具链(这可能需要半小时):
ct-ng build

>

  • 如果它成功运行,您现在应该在/users/user/ct-ng-toolchains/armv7-rpi2-linux-gnueabihf/bin中看到大量二进制文件,即armv7-rpi2-linux-gnueabihf-gcc

    要使用新的交叉编译器生成cargo,必须:

    1. 将上面列出的bin文件夹添加到您的路径:
    export PATH="${PATH}:/Users/USER/ct-ng-toolchains/armv7-rpi2-linux-gnueabihf/bin"
    
    [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
    
       Compiling hello v0.1.0 (file:///Users/USER/rust/hello)
        Finished dev [unoptimized + debuginfo] target(s) in 0.85 secs
    
    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代码,我试图在这里总结它,因为我在收到那篇文章前几个小时发现了这个问题:)

  •  类似资料:
    • 问题内容: 基本上,我在Linux上进行开发时,尝试将最简单的代码编译到Windows。 我通过搜索互联网找到了这些命令: 可悲的是,它们都不起作用。它给我关于标准箱丢失的错误 有没有办法在Windows上运行的Linux上编译代码? 问题答案: Rust发行版仅提供主机系统的编译库。但是,根据Rust上Arch Linux的Wiki页面 ,您可以从系统目录中适当位置(位于或中,具体取决于Wind

    • 问题内容: 到目前为止,我已经在ubuntu系统上安装了所有交叉编译软件包,但是遇到了问题,需要一些帮助。 这是我需要交叉编译的目标计算机。编译时应使用哪些标志? 问题答案: 给出以下列表, gcc-4.7-aarch64-linux-gnu-GNU C编译器 gcc-4.7-arm-linux-gnueabi-GNU C编译器 gcc-4.7-arm-linux-gnueabi-base-GCC

    • 问题内容: 是否有用于从Linux到Windows交叉编译C ++应用程序的手册? 只是。我想要一些信息(链接,参考,示例…)来指导我做到这一点。 我什至不知道是否可能。 我的目标是在Linux上编译程序并获取一个可以在Windows下运行的.exe文件。 问题答案: 基础不太难: 替换为,或您的Linux发行版使用的任何格式。这将为Windows 生成一个。 一旦解决了这个问题,就可以使用aut

    • 本文档说明如何在kali linux上配置ARM交叉编译环境,是我们多份关于”定制ARM镜像”的文档的起点. 开发机的配置 编译内核生成镜象通常需要大量硬盘空间.确保你的开发机至少有50G可用硬盘空间以及足够的内存,CPU不要太差. 安装依赖 先安装ARM交叉编译所需的依赖. apt-get install git-core gnupg flex bison gperf libesd0-dev b

    • 我试图交叉编译一个linux系统的简单hello world程序。 我有以下资料: null 我试图运行/lib/libc.so.0来获取版本信息,但出现了一个分段错误。它似乎用-static编译解决了这个问题。所以我想这是libc库的问题。谢谢你的帮助。

    • 安装gcc进行ARM交叉编译的问题 我一直在尝试安装gcc-arm-linux-fnueabi包,并且通过几种不同的方法安装了几次,但似乎总是缺少includes目录中的C++文件夹。 我的机器:32&64位英特尔i5处理器,在华硕上运行Ubuntu 14.10 目标设备:Beaglebone(黑色)