JHHK

欢迎来到我的个人网站
行者常至 为者常成

配置及编译项介绍

目录

Build Phases

一、Target Dependencies

用于指定当前目标(Target)所依赖的其他目标(Targets)

自动处理依赖关系:Xcode 会在构建当前目标之前,优先构建它所依赖的目标。

target我们自己的代码如果它是被依赖的,构建时优先构建它。

将系统库和三方库链接到应用程序中,使用这些库提供的功能。

系统库和三方库:我们拿到的是二进制文件没有源码

Build Settings

一、Architectures

1、介绍

当前平台支持的架构列表。
平台(操作系统):iOS、 macOS、 Android、 Windows等
架构(指令集):x86_64、 arm64
我们在xcode的编译日志里有时还会看到如下的arm64:
arm64-apple-ios:这是为实际 iOS 设备编译的二进制文件,用于 iPhone、iPad 等
arm64-apple-ios-simulator:这是为在 Apple Silicon Mac 上运行的 iOS 模拟器编译的二进制文件,用于模拟 iOS 设备的环境。

一个平台在不同时期有可能会有不同的架构,比如macOS之前使用的因特尔的芯片指令集为x86,后来使用的是苹果自研的芯片指令集为arm64
不同平台执行的可执行文件的格式是不同的,iOS 和 macOS的可执行文件的格式是Mach-O,windows的可执行文件是exe。
即使iOS和macOS的可执行文件格式都是Mach-O,他们也是有所不同的,因为他们提供给操作系统的二进制接口DBI不同(xy:代码布局)

所以要先看平台,再看架构

如何查看二进制文件具体是哪个平台的哪个架构呢?

查看平台

otool -lv SwiftFramework | grep platform

查看架构

//使用file命令
file SwiftFramework

//或者lipo命令
lipo -info SwiftFramework

2、关于合并

关于合并我们有个lipo命令:他可以合并同一平台下的不同架构的二进制文件。
lipo 会将每个架构的机器代码并列存储在一个文件中,而不会混淆它们。
这使得操作系统可以在运行时选择适合当前设备架构的代码。
注意:lipo不能合并不同平台的二进制文件,即使他们是同一架构的。比如给模拟器运行的Framework和给真机运行的Framework是不能通过lipo命令进行合并的

$ file SwiftFramework 
SwiftFramework: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
SwiftFramework (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
SwiftFramework (for architecture arm64):	Mach-O 64-bit dynamically linked shared library arm64



// 我们先将其拆分
$ lipo -thin arm64 SwiftFramework -output SwiftFramework_arm64
$ file SwiftFramework_arm64 
SwiftFramework_arm64: Mach-O 64-bit dynamically linked shared library arm64

$ lipo -thin x86_64 SwiftFramework -output SwiftFramework_x86_64
$ file SwiftFramework_x86_64 
SwiftFramework_x86_64: Mach-O 64-bit dynamically linked shared library x86_64



//接下来我们试试lipo的合并命令
//lipo -create -output UniversalBinaryPath inputPath1 inputPath2
$ lipo -create -output SwiftFramework_new SwiftFramework_arm64 SwiftFramework_x86_64
$ file SwiftFramework_new 
SwiftFramework_new: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit dynamically linked shared library x86_64] [arm64:Mach-O 64-bit dynamically linked shared library arm64]
SwiftFramework_new (for architecture x86_64):	Mach-O 64-bit dynamically linked shared library x86_64
SwiftFramework_new (for architecture arm64):	Mach-O 64-bit dynamically linked shared library arm64

那么应该怎么合并不同平台下的二进制文件呢?

XCFramework用于解决多平台、多架构二进制文件的分发问题。 使用 XCFramework 时,Xcode会自动选择合适的平台和架构版本,开发者不需要再手动管理这些细节。

比如:
XCFramework 可以同时包含 iOS、iPadOS、macOS、tvOS 和 watchOS 的框架版本,以及模拟器和真机版本。
这解决了传统胖二进制文件无法合并不同平台二进制文件的问题。

xcodebuild -create-xcframework \
  -framework "path/to/ios-device.xcarchive/Products/Library/Frameworks/YourFramework.framework" \
  -framework "path/to/ios-simulator.xcarchive/Products/Library/Frameworks/YourFramework.framework" \
  -output "path/to/YourFramework.xcframework"

二、Build Active Architecture Only

先看下官方解释
If enabled, only the active architecture is built. This setting will be ignored when building with a run destination which does not define a specific architecture, such as a ‘Generic Device’ run destination.
如果启用,则只构建活动体系结构。当使用未定义特定体系结构的运行目标(如“Generic Device”运行目标)构建时,此设置将被忽略。

开发环境(Debug):
通常设置为 YES,因为你通常只需要为当前设备或模拟器编译。这可以减少编译时间,尤其是当项目包含大量代码时。

发布环境(Release):
通常设置为 NO,这样编译的二进制文件可以支持所有目标架构,确保应用可以在不同设备上运行。

二、Excluded Architectures

先看下官方解释
A list of architectures for which the target should not be built. These architectures will be removed from the list in ARCHS when the target is built. If the resulting list of architectures is empty, no binary will be produced. This can be used to declare architectures a target does not support for use in environments where ARCHS is being overridden at a higher level (e.g., via xcodebuild).
不应该为其构建目标的体系结构列表。当构建目标时,这些体系结构将从arch中的列表中删除。如果生成的体系结构列表为空,则不会生成二进制文件。这可以用来声明目标不支持的体系结构,以便在更高级别(例如,通过xcodebuild)覆盖arch的环境中使用。


行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.