簡體   English   中英

Zig 如何將 Rust 代碼從 Intel Mac 交叉編譯到 M1 Mac?

[英]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 來省去所有這些麻煩:

https://github.com/rust-cross/cargo-zigbuild

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM