在 macOS 上編譯 libimagequant
的雙架構(aarch64
+ x86_64
)通用二進制庫,以下是完整步驟:
??1. 準備 Rust 工具鏈??
# 安裝兩個目標平臺
rustup target add aarch64-apple-darwin x86_64-apple-darwin# 確認安裝成功
rustup target list --installed
# 應輸出:aarch64-apple-darwin, x86_64-apple-darwin
??2. 分別編譯兩個架構??
??編譯 ARM64 架構 (M1/M2)??
cd /Users/admin/open_lib/libimagequant/imagequant-sys
cargo build --release --target aarch64-apple-darwin
??編譯 x86_64 架構 (Intel)??
cargo build --release --target x86_64-apple-darwin
??3. 合并為通用二進制 (Universal Binary)??
# 創建輸出目錄
mkdir -p target/universal# 使用 lipo 合并靜態庫
lipo -create \-output target/universal/libimagequant.a \target/aarch64-apple-darwin/release/libimagequant_sys.a \target/x86_64-apple-darwin/release/libimagequant_sys.a# 驗證合并結果
lipo -info target/universal/libimagequant.a
# 應輸出:Architectures in the fat file: target/universal/libimagequant.a are: x86_64 arm64
??4. 配置 Cargo 自動構建 (可選)??
在 imagequant-sys/Cargo.toml
中添加構建腳本配置:
[package]
build = "build.rs"[target.'cfg(target_os = "macos")'.dependencies]
libc = "0.2"
在 build.rs
中添加:
fn main() {println!("cargo:rerun-if-changed=build.rs");#[cfg(target_os = "macos")]{println!("cargo:rustc-link-search=native=target/universal");println!("cargo:rustc-link-lib=static=imagequant");}
}
??5. 驗證最終庫??
# 檢查文件類型
file target/universal/libimagequant.a
# 應顯示:Mach-O universal binary with 2 architectures# 檢查符號表
nm -arch arm64 target/universal/libimagequant.a | head
nm -arch x86_64 target/universal/libimagequant.a | head
??6. 清理與重建??
# 完全清理后重建
cargo clean
cargo build --release --target aarch64-apple-darwin
cargo build --release --target x86_64-apple-darwin
lipo -create ... # 重復步驟3
??常見問題解決??
- ??
lipo
報錯 "has same architecture"??
刪除舊庫再合并:
rm target/universal/libimagequant.a
- ??缺少
core
/std
錯誤??
確保工具鏈完整:
rustup component add rust-src
- ??Xcode 兼容性問題??
更新命令行工具:
xcode-select --install
??最終目錄結構??
libimagequant/
├── target/
│ ├── aarch64-apple-darwin/
│ ├── x86_64-apple-darwin/
│ └── universal/
│ └── libimagequant.a # 通用二進制
└── imagequant-sys/└── target/... # 子項目構建目錄
通過以上步驟,你將獲得一個同時支持 Intel 和 Apple Silicon 的靜態庫,可直接用于跨平臺分發。
全流程記錄
# 1. 進入項目目錄
cd /Users/admin/open_lib/libimagequant/imagequant-sys# 2. 清理并編譯ARM64架構 (M1/M2)
cargo clean && cargo build --target aarch64-apple-darwin
# 輸出示例:
# Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 41s# 3. 驗證ARM64二進制
cd ../target/aarch64-apple-darwin/debug
lipo -info libimagequant_sys.a
# 應輸出:Non-fat file: libimagequant_sys.a is architecture: arm64# 4. 返回項目目錄編譯x86_64架構 (Intel)
cd ../../../../imagequant-sys
cargo build --release --target x86_64-apple-darwin
# 輸出示例:
# Finished `release` profile [optimized] target(s) in 6.58s# 5. 驗證x86_64二進制
cd ../target/x86_64-apple-darwin/release
lipo -info libimagequant_sys.a
# 應輸出:Non-fat file: libimagequant_sys.a is architecture: x86_64# 6. 創建通用二進制
cd ../../..
mkdir -p universal
lipo -create \target/aarch64-apple-darwin/debug/libimagequant_sys.a \target/x86_64-apple-darwin/release/libimagequant_sys.a \-output universal/libimagequant_universal.a# 7. 最終驗證
lipo -info universal/libimagequant_universal.a
# 應輸出:Architectures in the fat file: universal/libimagequant_universal.a are: arm64 x86_64