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
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 项目并重新运行 Cargo build:
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
- 将您的文件发送到 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我试图在这里总结一下,因为我在收到那篇文章之前几个小时就发现了这个问题:)