如何交叉编译 rust 代码从英特尔Mac到M1 Mac的Zig?

uxhixvfz  于 2023-01-17  发布在  Mac
关注(0)|答案(1)|浏览(407)

最近我对Rust中的交叉编译很好奇。据我所知,在Go或Zig中做同样的事情很简单。但是在Rust中,这很困难。我在我的Intel MacBook Pro中编写Rust代码,想交叉编译以获得可以在M1 MacBook Pro中运行的可执行文件。我尝试了一些,在链接器中得到了一些错误。
以下是我的尝试。
我安装生 rust 的工具和zig以下的官方指示。

$ rustc --version
rustc 1.65.0 (897e37553 2022-11-02)
$
$ zig version
0.10.0-dev.4560+828735ac0

而我的铁 rust 项目结构就是这样的:

hello-world -----
                 |--- .cargo--
                             |-- config.toml
                 |--- src-----
                             |-- main.rs
                 Cargo.toml
                 zig

并且有一些文件看起来像:
一个一个二个一个一个一个三个一个一个一个一个一个一个四个一个一个一个一个一个五个一个
我用brew安装libiconv:

$ brew install libiconv

它将libiconv放入目录/usr/local/opt/libiconv/lib

$ ls /usr/local/opt/libiconv/lib
libcharset.1.dylib libcharset.a  libcharset.dylib libiconv.2.dylib libiconv.a libiconv.dylib

我通过rustup安装目标aarch64-apple-darwin,可以看到:

$ rustup show
Default host: x86_64-apple-darwin
rustup home:  /Users/<my name>/.rustup

installed targets for active toolchain
--------------------------------------

aarch64-apple-darwin
x86_64-apple-darwin
x86_64-unknown-linux-gnu
x86_64-unknown-linux-musl

active toolchain
----------------

stable-x86_64-apple-darwin (default)
rustc 1.65.0 (897e37553 2022-11-02)

然后我开始在hello-world目录中构建:

$ CC=./zig cargo build --target aarch64-apple-darwin
...
...
note: error(link): mismatched cpu architecture: expected aarch64, found x86_64
          error: MismatchedCpuArchitecture

我从stackoverflow找到了一些解决方案,它说我可以use macOS sdk to cross-compile
但是我认为完成交叉编译的方法不止一种,很想知道如何用zig来解决。
顺便说一句,我只知道组装的基本步骤,不是很详细,我没有连接的经验。
有谁能给我提些建议吗?
如有任何答复,我们将不胜感激。

e4eetjau

e4eetjau1#

这可能不足以完全解决您的问题,但是您至少需要将交叉编译标志传递给Zig,并且还需要使用cc子命令。
还要注意,Zig使用macos而不是darwin
所以你需要设置CC="./zig cc -target aarch64-macos",也就是说,我不确定Rust现在是否支持CC命令中的空格(至少在不久前是不支持的),如果不支持,你需要将所有内容 Package 在一个bash脚本(zcc.sh)中:

#!/bin/sh
ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig cc -target aarch64-macos $@

然后CC=./zcc.sh
还要注意的是,如果您还依赖于C++代码,则需要对zig c++执行相同的操作。在这种情况下,要设置的env变量是CXX
在这里你可以找到这样做的人建立wasmtime:
https://actually.fyi/posts/zig-makes-rust-cross-compilation-just-work/
最后,你可以简单地使用cargo-zigbuild来保存所有这些麻烦:
https://github.com/rust-cross/cargo-zigbuild

相关问题