我想将macOS上的Rust应用程序交叉编译为Raspberry Pi2。我进行了很多搜索,但没有找到可行的解决方案。我尝试的最后一个解决方案是遵循此answer,但是我无法使其正常工作。
我做了什么:
在我的项目的根目录中创建了.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体系结构的正确方法是什么?
答案 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
。
要使用新的交叉编译器构建货物,您必须:
export PATH="${PATH}:/Users/USER/ct-ng-toolchains/armv7-rpi2-linux-gnueabihf/bin"
/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
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 Codes,我试图在这里进行总结,因为我在获得这篇文章的几小时前就发现了这个问题:)