libimagequant 在 mac 平台编译双架构

在 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88767.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

暑期自学嵌入式——Day01(C语言阶段)

点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 主页: 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1011.2682.3001.5343感悟: 今天我认为最重…

Flutter基础(前端教程⑧-数据模型)

这个示例展示了如何创建数据模型、解析 JSON 数据,以及在 UI 中使用这些数据:import package:flutter/material.dart; import dart:convert;void main() {// 示例:手动创建User对象final user User(id: 1,name: 张三,age: 25,email: zhangsa…

SSRF10 各种限制绕过之30x跳转绕过协议限制

ssrf漏洞在厂商的处理下可能进行一些特殊处理导致我们无法直接利用漏洞 有以下四种: 1.ip地址限制绕过 2.域名限制绕过 3.30x跳转绕过域名限制 4.DNS rebinding绕过内网ip限制 本章我们讲30x跳转绕过域名限制 30x跳转绕过域名限制 之前我们使用ssrf漏洞时可以…

DNS解析过程和nmap端口扫描

目录 DNS解析流程: nmap端口扫描 指定扫描方式 TCP全连接扫描 -sT SYN半连接扫描 -sS -sT和 -sS的区别 Linux提权 利用好谷歌语法查找敏感信息 如果自己搭建了网站文件要放在phpstudy_pro\WWW下。 如果想要使用域名访问网站,需要在phpstudy_pro…

【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】

1. 开源大模型技术发展现状1.1 DeepSeek等主流开源大模型的技术特性分析 DeepSeek作为当前最具代表性的开源大模型之一,其技术架构具有多项创新特性。该模型采用混合专家架构(MoE),通过将视觉编码分离为"理解"和"生成"两条路径&…

java8 ConcurrentHashMap 桶级别锁实现机制

Java 8 ConcurrentHashMap 桶级别锁实现机制 Java 8 中的 ConcurrentHashMap 抛弃了分段锁设计,采用了更细粒度的桶级别锁(bucket-level locking)实现,这是其并发性能提升的关键。下面详细解析其实现原理: 1. 基本实现…

Python正则表达式实战指南

一 正则表达式库正则表达式是文本处理中不可或缺的强大工具,Python通过re模块提供了完整的正则表达式支持。本文将详细介绍re模块中最常用的match()、search()和findall()函数,以及贪婪模式与非贪婪模式的区别,帮助读者掌握Python中正则表达式…

使用球体模型模拟相机成像:地面与天空的可见性判断与纹理映射

在传统相机模拟中,地面通常被建模为一个平面(Plane),这在低空场景下是合理的。但在更大视场范围或远距观察时,地球的曲率不可忽视。因此,我们需要将地面模型从平面升级为球体,并基于球面与光线的…

Agent自动化与代码智能

核心问题: 现在很多团队做AI系统有个大毛病:只顾追求“高大上”的新技术(尤其是AI Agent),不管实际业务需不需要。 结果系统搞得又贵、又复杂、还容易出错。大家被“Agent”这个概念搞晕了:到底啥时候用简单…

SQL141 试卷完成数同比2020年的增长率及排名变化

SQL141 试卷完成数同比2020年的增长率及排名变化 withtemp as (selectexam_id,tag,date(submit_time) as submit_timefromexamination_infoleft join exam_record using (exam_id)wheresubmit_time is not null),2021_temp as (selecttag,count(*) as exam_cnt_21,rank() over…

C语言<数据结构-单链表>

链表是一种常见且重要的数据结构,在 C 语言中,它通过指针将一系列的节点连接起来,每个节点可以存储不同类型的数据。相比数组,链表在插入和删除元素时不需要移动大量数据,具有更好的灵活性,尤其适合处理动态…

archive/tar: unknown file mode ?rwxr-xr-x

这个是我在docker build报错的,这是一个node.js项目。我猜你也是一个node.js下的项目,或者前端项目。 解决方法: .dockerignore里面写一下node_modules就行了。 未能解决:archive/tar:未知文件模式?rwxr-…

【前端】ikun-markdown: 纯js实现markdown到富文本html的转换库

文章目录背景界面当前支持的 Markdown 语法不支持的Markdown 语法代码节选背景 出于兴趣,我使用js实现了一个 markdown语法 -> ast语法树 -> html富文本的库, 其速度应当慢于正则实现的同类js库, 但是语法扩展性更好, 嵌套列表处理起来更方便. 界面 基于此js实现vue组…

【echarts踩坑记录】为什么第二个Y轴最大值不整洁

目录问题复现示意图:解决方法有以下几种:1. 在y轴配置中手动设置max属性:2. 使用ECharts提供的坐标轴标签格式化功能:🚀写在最后问题复现示意图: 今天在用echarts图表的时候,出现了一个小问题。…

Duplicate cleaner pro 的使用技巧

Duplicate cleaner pro 的使用技巧前言文件去重基本介绍经验之谈目录结构修改盘符起因方法手动分配方法‌数据修改方法安装sqlite-web修改数据库GPU加速安装驱动获取驱动和硬件信息安装CUDA配置环境变量&#xff08;如果是自定义安装&#xff09;创建程序<1>获取参数和命…

数字孪生技术引领UI前端设计新趋势:增强现实与虚拟现实的融合应用

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;AR 与 VR 的 “割裂” 与数字孪生的 “融合” 契机增强现实&#xff08;AR&…

Qt使用dump文件记录并查找软件奔溃信息详细教程

Qt使用dump文件记录并查找软件奔溃信息一、dump文件概述1、dump文件的基本概念2、dump文件的常见类型3、dump文件的分析工具4、dump文件的应用场景二、具体实现步骤1、下载dbghelp库2、将库添加到自己的工程中3、main.cpp添加代码记录奔溃日志4、编写测试代码5、测试6、结果查看…

UI前端与数字孪生结合案例分享:智慧城市的智慧能源管理系统

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;能源管理的 “数字孪生革命”智慧城市的能源系统正面临 “供需失衡、损耗…

Android 16系统源码_SplashScreen窗口的创建流程(一)

一 点击桌面图标触发SplashScreen 1.1 点击桌面图标打开应用 点击桌面的短信图标&#xff0c;然后打开短信页面&#xff0c;使用winscope获取数据。从点击短信图标到应用内容完全展开&#xff0c;中间有出现一个标题带有“Splash Screen”字符串的窗口。 二 Splash Screen窗口创…

线性代数学习笔记

矩阵 矩阵是一种非常重要的数学对象,它通常由一个由数字排成的矩形阵列来定义。一个矩阵由若干行和若干列组成,被称为矩阵的行数和列数。一般情况下,矩阵的行数和列数分别用 n n n 和 m m m 表示。<