前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何创建可在 Apple 自研芯片和基于 Intel 的 Mac 机上运行的应用程序

如何创建可在 Apple 自研芯片和基于 Intel 的 Mac 机上运行的应用程序

作者头像
HelloWorld杰少
发布于 2022-08-04 05:51:15
发布于 2022-08-04 05:51:15
2.5K00
代码可运行
举报
文章被收录于专栏:HelloWorld杰少HelloWorld杰少
运行总次数:0
代码可运行

前言

原生的应用程序比转换的应用程序运行效率更高,因为编译器能够针对目标架构来优化代码。如果一个应用程序只支持 x86_64 架构,那必须在 Apple 芯片上的 Rosetta 转换下运行。通用二进制文件本身就可以在 Apple 芯片和基于 Intel 的 Mac 机上运行,因为它包含了两种架构的可执行代码。

以下列表包含了最通用的可执行文件类型,它们可以转换为通用二进制文件。ps: 该列表并不详尽,但是可以将其用作评估项目的入口。

•Apps•App extensions•Plug-ins•Custom frameworks•Static libraries•Dynamic libraries•Build tools•Command-line tools•Daemons and launch agents•DriverKit extensions•Kernel extensions

下载安装最新版本的 Xcode12

早期版本的 Xcode 不包含构建和测试 macOS 代码通用版本所需的支持。

更新 Xcode 工程架构列表

Xcode 12 及更高版本会自动将 arm64 架构添加到所有 macOS 二进制文件(包括应用程序和库)的标准架构列表中。在调试和测试过程中,在默认情况下,Xcode 仅针对当前系统架构构建版本,但是,它会为代码的 Release 版本自动构建通用二进制文件。

如果您在 Xcode 工程中自定义了 Architectures 构建设置,请删除您的自定义项并改用 Standard Architectures 设置。

更新自定义 Makefile 结构列表

如果使用自定义脚本或 makefile 构建项目,则将 arm64 架构添加到适当的环境变量中。Xcode 使用 ARCHS 环境变量来定义当前的构建架构。其他构建系统可能使用不同的环境变量,但目的相似。将变量添加到适当的环境变量后,编译代码并验证编译器是否创建了代码的 arm64 版本。要为项目创建通用二进制文件,请使用 lipo 工具将生成的可执行文件合并为单个可执行二进制文件。

对于在 Xcode 之外创建的 makefile,请使用 -target 选项将适当的架构值传递给编译器。以下示例显示了一个 makefile 一次编译一个源文件两次,每种架构一次。然后,通过将生成的可执行文件与 lipo 工具合并在一起,创建通用二进制文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x86_app: main.c
    $(CC) main.c -o x86_app -target x86_64-apple-macos10.12
arm_app: main.c
    $(CC) main.c -o arm_app -target arm64-apple-macos11
universal_app: x86_app arm_app
    lipo -create -output universal_app x86_app arm_app

使用宏封装特定平台的代码

在为特定平台或处理器类型编写代码时,请使用适当的条件编译语句隔离该代码。对于基于 C 的代码,系统定义了一组宏供您在 /usr/include/TargetConditionals.h 中使用。Swift语言还支持使用条件编译块进行条件编译。如果跨多个平台共享代码,则还可以在条件编译语句中使用特定于编译器的宏,例如 arm64aarch64

为了区分特定类型处理器的代码,请添加针对适当架构的条件编译语句。通用 macOS 应用程序支持 arm64 和 x86_64 体系结构,以下示例显示了如何为这些架构编写条件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#if arch(arm64)
   // Code meant for the arm64 architecture here.
#elseif arch(x86_64)
   // Code meant for the x86_64 architecture here.
#endif

如果在 iOS 和 macOS 应用之间共享代码,不要以为用于 arm64 架构的代码仅在 iOS 设备上运行,该代码也可以在 基于 Apple 芯片上的 macOS 应用中运行,要区分 macOS 或 iOS 平台,请使用以下示例中显示的条件编译语句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#if os(macOS)
   // Put CPU-independent macOS code here.
   #if arch(arm64)
      // Put 64-bit arm64 Mac code here.
   #elseif arch(x86_64)
      // Put 64-bit x86_64 Mac code here.
   #endif
#elseif targetEnvironment(macCatalyst)
   // Put Mac Catalyst-specific code here.
#elseif os(iOS)
   // Put iOS-specific code here.
#endif

有关条件编译宏的完整列表,请参见 /usr/include/TargetConditionals.h 头文件。

编译你的 Target

当你在可调式版本下编译代码时,默认情况下 Xcode 只会针对当前的架构编译。您可以通过更改项目的 Build Active Architecture Only 选项来在任意的 Mac 机上创建带有调试符号的通用二进制文件。尽管您可以在基于 Intel 的 Mac 计算机上创建此二进制文件,但是无法在 arm64 架构上运行或者调试,只有具有 Apple 芯片的 Mac 才能运行和调试。

判断您的二进制文件是否通用

对用户而言,通用二进制文件看起来与为单个架构构建的二进制文件没有什么不同。当您构建通用二进制文件时,Xcode 会两次编译您的源文件,每种架构一次,Link 每种架构的二进制文件后,Xcode 使用 lipo 工具将特定架构的二进制文件合并到单个可执行文件中。如果自己编译源文件,则必须在构建脚本中调用 lipo,将特定架构的二进制文件合并为单个通用二进制文件。

以下示例显示了如何使用 lipo 在 macOS 中查看 Mail 应用程序的架构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
% lipo -archs /System/Applications/Mail.app/Contents/MacOS/Mail
x86_64 arm64

指定应用程序的启动行为

对于通用二进制文件,系统倾向于执行当前平台原生的架构,在基于 Intel 的 Mac 电脑上,系统始终执行 x86_64 架构。在 Apple 芯片上,系统倾向于在 arm64 架构上执行。用户可以通过在 Finder 的 "显示简介" 窗口中启用相应的选项,来强制系统在 Rosetta 转换下运行该应用程序。

如果您不希望用户在 Rosetta 转换下运行您的应用程序,请将 LSRequiresNativeExecution 键添加到应用程序的 Info.plist 文件中。当其设置为 YES 时,系统会阻止您的应用在转换后运行。另外,系统还会从您应用的 "显示简介" 窗口中删除 Rosetta 转换选项。在确认您的应用程序可以在 Apple 芯片 和基于 Intel 的 Mac 电脑上正常运行之前,请不要包含此键值对。

如果您想设置架构的优先级,而又不阻止用户在转换过程中运行您的应用,请将 LSArchitecturePriority 键添加到您应用的 Info.plist 文件中。该键的值是字符串的有序数组,它们定义了选择架构的优先级顺序。

本篇文章到此就结束了,如果想要更进一步的了解,请移步:

https://developer.apple.com/documentation/xcode/building_a_universal_macos_binary

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HelloWorld杰少 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
新手必看!MacBook Pro苹果电脑M系列芯片安装 Label Studio 教程方法大全
本文将从零开始,面向完全没有相关经验的初学者用户,详细地介绍如何在配备 Apple M 系列芯片的 MacBook Pro 上成功安装并运行 Label Studio。文中所有示例均基于 macOS Ventura 及以上版本如 macOS Monterey、macOS Big Sur 等,并假设你使用的是 M1、M1 Pro、M1 Max、M2 等架构。请务必按顺序阅读,确保每一步操作都能顺利完成。
猫头虎
2025/06/08
660
iOS App Store 提交被拒?请收好这份最新 ITMS 错误速查表
在iOS应用分发过程中,超过78%的构建包会在首次提交至App Store Connect时触发ITMS(iTunes Store)系列校验错误。这些由苹果自动化校验系统抛出的错误码(如ITMS-90023、ITMS-90809、ITMS-90713等),实质上是苹果对元数据格式、二进制文件合规性、API调用链完整性等维度的强约束规则集。
移动开发技术
2025/05/22
1440
iOS 了解Xcode Bitcode
看了以上内容,我们就可以对Bitcode有一个简单的了解了。那么如果我们项目中在使用某些Framework或.a的时候,遇到了类似笔者遇到的错误的时候,我们就需要查看所用的Framework或.a是否支持bitcode。
且行且珍惜_iOS
2022/05/13
9910
iOS 了解Xcode Bitcode
Mac M1原生(ARM64)Golang dev&debug
通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG的问题。
yoyofx
2021/01/18
4K0
iOS开发之进阶篇(1)—— 证书、打包上架流程、p12文件
iOS开发相关的证书有很多种,iOS开发证书(iOS App Development)、iOS发布证书(iOS Distribution (App Store and Ad Hoc))、网站推送ID证书(Website Push ID Certificate)、Apple Pay付款处理证书(Apple Pay Payment Processing Certificate)等等。Xcode 11以后,又新增了Apple Development和Apple Distribution,前者是iOS/macOS/tvOS/watchOS各平台开发证书的结合,后者是这些平台的发布证书结合。
iOS Magician
2023/03/22
1.6K0
现今 Swift 包中的二进制目标
在 iOS 和 macOS 开发中, Swift 包现在变得越来越重要。Apple 已经努力推动桥接那些缝隙,并且修复那些阻碍开发者的问题,例如阻碍开发者将他们的库和依赖由其他诸如 Carthage[1] 或 CocoaPods[2] 依赖管理工具迁移到 Swift 包依赖管理工具的问题,例如没有能力添加构建步骤的问题。这对任何依赖一些代码生成的库来说都是破坏者,比如,协议和 Swift 生成。
Swift社区
2022/12/12
2K0
iOS强化 : 熟悉 Mach-O 文件
Mach-O(Mach Object)是 macOS、iOS、iPadOS 存储程序和库的文件格式。对应系统通过应用二进制接口(application binary interface,缩写为ABI) 来运行该格式的文件。
网罗开发
2021/04/26
1.3K0
iOS强化 : 熟悉 Mach-O 文件
Apple M1 芯片目前对开发者来说未必是好事
苹果近日推出的首款自研的 Apple M1 芯片,收到了很多用户的欢迎,但随着这些用户拿到真机,很多问题暴露出来。
用户7454708
2023/05/08
9540
Apple M1 芯片目前对开发者来说未必是好事
如果你的mac装包很困难,那就试试...
人啊,身在福中要知福。平时安装一些非常常用的包是从cran和bioconductor上,所以感觉不出来什么。正因为有他们,你才避免掉了很多包要编译的问题!
用户11414625
2024/12/20
1460
如果你的mac装包很困难,那就试试...
Xcode 常见 CLI 工具
在咱们日常开发中,或多或少都会用到 Xcode 内置的一些CLI工具,但是大部分小伙伴可能只是会用到一些具体的命令,今天我们就一起来聊一聊 Xcode 内置的常见Command Lines Tool。
CoderStar
2022/09/23
3.8K0
Swift Module Interfaces
今天看到一篇讲 Swift Crash 的文章一个 Swift Crash 引发的讨论...原文作者从Swift源码和UIKitCore -[UIView(UIKitManual) autorelease] 汇编代码的角度对 crash 的原因进行了分析。
酷酷的哀殿
2020/10/26
1.7K0
Swift Module Interfaces
iOS逆向之Mach-O文件
阅读笔者的其他文章,我们了解了编译过程中的预处理、词法分析、语法分析、编译、链接等步骤。经常和编译型语言打交道的开发者对于可执行文件的编译过程肯定不陌生。我们用 Xcode 构建一个程序的过程中,会把源文件 (.m 和 .h) 文件转换为一个可执行文件。这个可执行文件中包含的字节码将会被 CPU (iOS 设备中的 ARM 处理器或 Mac 上的 Intel 处理器) 执行。
VV木公子
2021/03/07
11.2K0
iOS逆向之Mach-O文件
Appium中iOS环境搭建指南
最近在搞iOS自动化环境基于Appium框架,Appium框架搭建iOS每当捡起来使用就各种坑,总结一下iOS自动化环境搭建问题,避免其他同学踩坑~
测试加
2022/12/05
1.8K0
Appium中iOS环境搭建指南
llvm 编译器高级用法:第三方库插桩
最近看到一篇有意思的技术文章:《抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%》。
酷酷的哀殿
2021/01/04
3.8K0
llvm 编译器高级用法:第三方库插桩
Xcode 创建.a和framework静态库
最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录。
Haley_Wong
2018/08/22
3.4K0
Xcode 创建.a和framework静态库
使用Zig在arm64上引导Uber的基础设施
2021 年 11 月,我们决定评估 arm64 架构在 Uber 的可行性。我们的大多数服务是用 Go 或 Java 编写的,但我们的构建系统只能编译成 x86_64。现在,得益于开源合作,Uber 拥有了一个独立于系统的构建工具链,可以无缝地支持多种架构。我们使用这个工具链来引导 arm64 主机。本文将分享我们是如何着手去做这件事情的,以及我们早期的想法、遇到的问题、达成的一些成就和未来的方向。
深度学习与Python
2023/08/09
5240
使用Zig在arm64上引导Uber的基础设施
xmake v2.6.5 发布,远程编译支持
它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
ruki
2022/06/06
5110
xmake v2.6.5 发布,远程编译支持
armv6、armv7、armv7s、arm64 与开发静态库(.a)
ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,它的性能在同等功耗产品中也很出色,几乎所有手机都是使用它的。
全栈程序员站长
2022/09/07
1.3K0
APP生成与运行(一)
CPU 由上亿个晶体管组成,在运行的时候,单个晶体管只能根据电流的流通或关闭来确认两种状态,我们一般说 0 或 1,根据这种状态,人类创造了二进制,通过二进制编码我们可以表示所有的概念。但是,CPU 依然只能执行二进制代码。我们将一组二进制代码合并成一个指令或符号,创造了汇编语言,汇编语言以一种相对好理解的方式来编写,然后通过汇编过程生成 CPU 可以运行的二进制代码并运行在 CPU 上。
Helloted
2022/06/07
1.2K0
APP生成与运行(一)
曝微软将仿效苹果自研ARM芯片,用于Surface和服务器,英特尔股价应声下跌6%
---- 新智元报道   来源:外媒 编辑:Q 【新智元导读】微软目前使用基于英特尔的处理器为其 Azure 云服务提供大部分服务,而且该公司的大部分 Surface 产品线也使用英特尔芯片。但有消息称,微软将为服务器和PC设计自己的芯片。 继苹果之后,微软也宣布将自己设计芯片。 早在2018年,就有报道称微软曾考虑在最初的 Surface Go 中使用基于ARM的芯片,但在英特尔请愿反对这一想法后,微软最终选择了不这么做。 目前,微软几乎完全使用基于英特尔的处理器来支持其 Azure 云服务。但据报
新智元
2023/05/22
4180
曝微软将仿效苹果自研ARM芯片,用于Surface和服务器,英特尔股价应声下跌6%
推荐阅读
相关推荐
新手必看!MacBook Pro苹果电脑M系列芯片安装 Label Studio 教程方法大全
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验