[英]How to cross compile Rust code from Intel Mac to M1 Mac by Zig?
這些天我對Rust中的交叉編譯感到好奇。據我所知,在Go或Zig中做同樣的事情非常簡單。但是在Rust中,這非常困難。我在我的Intel MacBook Pro中編寫Rust代碼,想要交叉編譯得到可以在M1 MacBook Pro上運行的可執行文件。 我進行了一些嘗試,並在 linker 中遇到了一些錯誤。
這是我試過的。
我按照官方說明安裝了 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
還有一些文件看起來像:
// main.rs
fn main() {
println!("hello world")
}
// config.toml
[target.aarch64-apple-darwin]
rustflags = ["-C", "linker-flavor=ld", "-C", "link-self-contained=no", "-C", "link-arg=-L/usr/local/opt/libiconv/lib"]
linker = "./zig"
// Cargo.toml
[package]
name = "hello-world"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
#[profile.release]
#lto=true
// zig
#!/usr/bin/env zsh
zig cc -target aarch64-macos-none $@
我通過 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上找到了一些解決方案,它說我可以使用macOS sdk來交叉編譯.
但是我認為完成交叉編譯的方法不止一種,真的很想知道如何使用zig
解決它。
順便說一句,我只知道組裝的基本步驟,不詳細,我沒有鏈接經驗。
誰能給我一些建議?
任何答案將不勝感激。
這可能不足以完全解決您的問題,但您至少需要將交叉編譯標志傳遞給 Zig,並且您還需要使用cc
子命令。
另請注意,Zig 使用macos
而不是darwin
。
所以你需要設置CC="./zig cc -target aarch64-macos"
,也就是說,我不確定 Rust 現在是否支持 CC 命令中的空格(至少前一段時間不支持)。 如果沒有,您需要將所有內容包裝在 bash 腳本 ( zcc.sh
) 中:
#!/bin/sh
ZIG_LOCAL_CACHE_DIR="$HOME/tmp" zig cc -target aarch64-macos $@
然后CC=./zcc.sh
另請注意,如果您還依賴 C++ 代碼,則需要對zig c++
執行相同的操作。 在這種情況下要設置的環境變量是CXX
。
在這里你可以找到有人這樣做來構建 wasmtime:
https://actually.fyi/posts/zig-makes-rust-cross-compilation-just-work/
最后,您可以簡單地使用 cargo-zigbuild 來省去所有這些麻煩:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.