导航:首页 > 源码编译 > xcode编译模拟器版本

xcode编译模拟器版本

发布时间:2023-01-01 07:59:21

❶ M1 设备的 Xcode 编译问题深究

在Apple发布M1芯片之前,一直使用Intel的芯片,没有出现什么问题。发布M1芯片后,由于两者架构的不同(M1是arm64架构,Intel是x86_64的架构),导致很多软件运行出现了问题。我们在M1机型中使用Xcode编译模拟器时,可能会碰到如下报错:



这些报错,都是是由于项目中存在.a或.framework静态库导致的。以前,我们创建静态库时,会分别打包出一份针对真机(arm64)和模拟器的(x86_64),然后将这两份合并成一个包后引入项目中进行使用。在Intel机型上,真机上使用arm64指令,模拟器(x86_64)中使用x86_64指令,所以不存在问题。但是在M1机型上,模拟器是以arm64运行的,显然再以x86_64运行就会出现问题。

对于这类架构报错问题,网上的资料一般会告诉你两个解决方案:
以Rosetta模式运行Xcode。
修改Build Settings -> Excluded Architectures选项,添加Any iOS Simulator SDK选项,并设置值为arm64。图示如下:

这两种方案都能解决编译问题,但是也都存在问题。

以Rosetta模式运行是M1机器上x86软件无法运行的解决方案,它会将x86指令转译成ARM指令运行,这种转译显然是存在性能损耗的,损耗大概在20%~30%,不到万不得已,不推荐使用这种方案。
Excluded Architectures方案说明

修改Excluded Architectures选项也有它的问题。字面意思是排除架构的意思,我们设置在模拟器中排除arm64就能解决模拟器无法编译arm64的问题。
这样的设置能生效会让人有点费解,我们知道,在intel机型上,模拟器本来就是以x86方式运行的,排除arm64毫无影响。但是在M1机型上,模拟器是以arm64方式运行的,排除了arm64反而能跑,这不是把我的智商摁在地上摩擦么?,但是苹果就是这样干的,当在M1机型上,排除了模拟器的arm64架构后,模拟器还是会以arm64的方式运行,但是模拟器中的app是以x86的方式运行的,对苹果的这个骚操作我们不得不服。图示如下:

有时候在Excluded Architectures选项中排除了模拟器的arm64指令,依然无法编译通过,那么一般是项目设置和cocoapods的设置不一致导致,设置为一致后一般可以解决问题。可以通过在Podfile中添加如下内容来解决:

通过上述内容,我们知道了问题的由来,它是由于项目中存在.a或.framework,它们提供的指令集不完整导致的。Apple对于这类问题,也提供了解决方案,请由我细细道来。

以Xcode13为例,在我们创建静态库时,选择真机编译出来的包只包含arm64指令,选择模拟器编译出来的会同时包含arm64和x86_64指令。我看一些网上的教程,教别人将模拟器部分的arm64移除,其实大可不必。因为要支持M1机器正常跑模拟器,模拟器必须同时包含arm64和x86_64指令。

2019年的WWDC,apple提供了一种新的框架封装格式XCFramework。简单理解就是以前使用lipo合并不同指令集的包,现在则使用新的指令合并成XCFramework格式

打包成framework,格式如下:

打包成XCFramework后,格式如下:

从上述可以看出,XCFramework就是把两个不同指令集的framework放入了同一个文件夹(.xcframework),并生成了一个配置文件Info.plist。这样生成的XCFramework就可以完美的解决M1机器无法编译模拟器的问题。
XCFramework的创建指令也很简单:

以现在的情况,很多第三方框架,并没有使用XCFramework,而项目中只要有一个框架没有支持模拟器的arm64指令,那么在M1机器上,模拟器只能以Rosetta模式运行应用,对这一块的普遍支持估计要等M1普及以后了。

苹果换芯,成了开发者们的噩梦?
armv6、armv7、armv7s、armv8、armv64及其i386、x86_64区别
细说iOS静态库和动态库
关于Xcode11的XCFrameworks框架

❷ Xcode Build For ios Simulator arm64

前言

将一个老项目由Xcode11升级到Xcode12的时候,在用模拟器编译的时候,报了一个错误,具体如下:

“ld: building for iOS Simulator, but linking in dylib built for iOS, file '/Users/xxxx/Work/Git/xxx/Framework/GoogleCast/GoogleCast.framework/GoogleCast' for architecture arm64”

我使用模拟器编译的,遇到arm64的错误,一开始还是一头雾水啊。于是Google和网络就上了,经过一番查找,基本定位到问题了。

原因

下面翻译一位外国同仁的解释:

Xcode 12实际上是Apple Silicon的垫脚石,但有了这个平台,我们将得到基于arm64的macOS,模拟器也将运行在arm64架构上,而不是目前基于Intel的x86_64架构。

Xcode通常依赖于“Run Destination”来构建它的库/应用程序,所以当一个模拟器被选择为“Run Destination”时,它将为可用的模拟器架构构建应用程序,当一个设备被选择为“Run Destination”时,它将为设备支持的架构构建(arm*)。

xcodebuild,在Xcode 12+ build系统中,arm64是支持Apple Silicon的有效架构。因此,当一个模拟器被选择为运行目标时,它可能会尝试针对基于arm64的模拟器编译/链接你的库/应用程序。所以它在<architecture>-<os>-<sdk>-<destination>格式中给clang(++)发送了一些-target标志,如arm64-apple-ios13.0-simulator,clang试图构建/链接基于arm64的模拟器,但最终在基于Intel的mac上失败。

但xcodebuild只在发布版本中尝试这个。因为“Build Active Architecture Only (ONLY_ACTIVE_ARCH)”构建设置通常被设置为“No”,仅用于“发布”配置。这意味着xcodebuild将尝试为选定的运行目标构建所有库/应用的架构变体。对于模拟器运行目标,它现在将包括x86_64和arm64,因为arm64在Xcode 12+中也是一个支持Apple Silicon的模拟器架构。

了解原因后,剩下来就是如何解决了。

解决方法

首先看一下Xcode11和Xcode12在Architecture配置这一块的区别:

Xcode11:

Xcode11中有Valid Architectures的配置项。

Xcode12:

在Xcode12中,在Architecture配置组中,用Excluded Architectures代替了Valid Architectures,那么Valid Architectures跑到哪里去了,在User-Defined配置组里面。

我们的目的是能在Xcode12的模拟器上顺利编译,那么可按照下面的步骤修改:

1. 将Build Active Architecture Only配置的debug值改为Yes。如下图。

2. 如果在Xcode11中有Valid Architectures的配置项,那么请在Xcode12的User-Defined配置组里面删除Valid Architectures的配置项,同时在Target上面的Project里面的User-Defined配置组里面同样删除Valid Architectures的配置项,如何删除,选中,敲击键盘的delete就可以了。

3. 将Validate Workspace配置项修改一次,一定要变成黑粗体,默认值是NO,改成Yes就可以,或者再改回NO,反正得折腾一次。见下图。(之前有一篇文章升级Xcode12.3报错提到过这个配置,可参考一下。)

4. 配置完前三步基本就能编译通过了,如果还是报错,请尝试在Excluded Architectures的debug模式下添加arm64,如下图:

经过这几步,基本就能顺利编译通过了,不过别忘了再用真机编译试试哦,别再影响了真机测试。

结束语

个人感觉这个是Xcode12的一个坑了,不过如果所有的项目里面都采用XCFramework,估计这个问题就能屏蔽掉了。

原文链接:https://blog.csdn.net/guoyongming925/article/details/114628455

❸ 求助,升级xcode5.1之后,无法编译到64-bit模拟器运行工程了

将ios app转换为兼容32位和64位步骤: 1. 安装 Xcode 5. 2. 打开你的项目。Xcode会提示你更新你的项目,其中的警告和错误信息对于转换到64位相当重要。 3. 将你的项目设置改换到支持iOS6或更高。如果你的iOS版本低于6,你无法生成64位的app。 4.将Architectures build设置改为“Standard Architectures (including 64-bit).” 5. 升级你的app使其适配64位的运行环境。模拟器可以帮你找到一些,但仅依靠编译器检查是不靠谱的,你还是需要根据文档自己来找。 6.使用64位的硬件进行测试。 7.使用Instruments工具调试程序的内存表现。

❹ xcode编译怎么选择ios库版本号

你说的是选择不同iOS版本的模拟器吗。,如图,这样选择即可

如果你的没有出现这么多的版本供你选择那你你需要到Xcode-Preferences-Components下载各个版本的模拟器

❺ Xcode 11.4 模拟器编译报错 Building for iOS Simulator was built for iOS

最近Xcode 升级到了Version 11.4 (11E146)版本。我也乘着工作间隙做了升级。

升级完成,选择模拟器编译,经过等待,没有意外,出现了报错。
Building for iOS Simulator, but the linked and embedded framework 'AipOcrSdk.framework' was built for iOS.
Building for iOS Simulator, but the linked and embedded framework 'AipBase.framework' was built for iOS.
Building for iOS Simulator, but the linked and embedded framework 'IdcardQuality.framework' was built for iOS.

读一下内容,意思是引用的第三方库是 build for iOS 的,不是build for iOS Simulator,这些库还都是网络的AI识别的真机库。

查了下苹果论坛,看看是否有相应的解决方案,然后看到了这篇类似问题
https://forums.developer.apple.com/thread/130684

自己经过尝试解决问题,然后总结出有2种解决方案。

猜测是Xcode 11.4 Debug模式下,对真机库的引用做了检查,我们在模拟器编译的时候,可以选择忽略这些文件,因为我们模拟器也不会真的使用这部分库的功能。

以上,可以正常用模拟器编译了。

❻ XCODE中怎么使用IOS 5.0的模拟器

解决了,原来是项目设置里面的
Deployment
Target设置的是5.1
换成5.0后,设备列表中就可以选5.0的模拟器了。
查看原帖>>

阅读全文

与xcode编译模拟器版本相关的资料

热点内容
如何测试流媒体服务器的并发能力 浏览:159
溯源码有分国家认证的吗 浏览:218
如何通过app查询产检报告 浏览:944
拉结尔安卓手机怎么用 浏览:695
驱动级进程代理源码 浏览:782
androidshape画线 浏览:510
程序员想辞职被拒绝 浏览:101
java面试逻辑 浏览:749
如何下载全英文app 浏览:724
js函数式编程指南 浏览:380
为什么安卓手机相机启动会卡 浏览:341
python中t是什么意思 浏览:765
移动硬盘内存加密 浏览:407
单片机测角度 浏览:864
URL服务器地址怎么填 浏览:438
压缩饼干会导致血糖高吗 浏览:569
cad中xc命令怎么用 浏览:424
戴尔服务器怎么看网卡接口 浏览:823
盐铁论pdf 浏览:424
最短路径的生成算法可用 浏览:457