libimagequant 在 mac 平台编译双架构

发布于:2025-07-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

在 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

​常见问题解决​

  1. lipo 报错 "has same architecture"​
    删除旧库再合并:
rm target/universal/libimagequant.a
  1. ​缺少 core/std 错误​
    确保工具链完整:
rustup component add rust-src
  1. ​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

网站公告

今日签到

点亮在社区的每一天
去签到