余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

excluded architectures 相关(包公不持一砚归相关网站个数)

xiyangw 2022-12-03 12:25 16 浏览 0 评论

问题现象1:

  1. building for iOS Simulator-arm64 but attempting to link with file built for iOS Simulator-x86_64
  2. building for iOS Simulator, but linking in object file built for iOS, file '/Users///framework/' for architecture arm64

问题分析:

字面意思来看,是说link了不支持模拟器的FrameWork,通常需要检查三方库,看看三方库是不是不支持模拟器,比如支付的早期就不支持模拟器。

Xcode12在编译模拟器的时候优先使用arm64架构编译,而过去打包模拟器是没有arm64的,arm64架构只适用于真机。因此报错linking了一个真机的FrameWork。

解决方案大致是(错误的方案):
I've seen quite a bit of weird behavior with frameworks, I think due to changes to the simulators to support Apple silicon. My temporary workaround is, in my app/extension targets, to add "arm64" to the Excluded Architectures build setting when building for the simulator (as your preview appears to be trying to do), and setting "Build Active Architecture Only" to No for all schemes. Might be worth a try.

Check if in your project for compiled target ->build settings -> user defined section (at the very bottom) you have defined VALID_ARCHS=arm64, if yes, delete it.

大致是说删除VALID_ARCHS=arm64,然后Build Active Architecture Only 设置为NO


image.png

实际测试,确实可行了。但是带来了新的问题,这样没法编译真机了……

解决方案(推荐2)

  1. build settings->excluded architectures 中加入arm64架构,代表不编译arm64架构。但是这种做法会导致无法编译真机,因为真机是arm64架构。所以需要勾选Any iOS Simulator SDK,解决。
  2. build settings->build active architecture only 设置为YES,代表仅编译当前项目中包含的架构。这个设置适用于模拟器和真机。
  3. 如果使用了XCConfig配置文件,那么设置EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64,效果同1


问题现象2:

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: ***.a have the same architectures (arm64) and can't be in the same fat output file

问题分析:

打包的时候设置Build Active Architecture Only为no则代表打适用于所有机型的包,Xcode11 打包的模拟器的.a默认支持i386、x86_64,Xcode12 打包的模拟器.a默认支持i386、x86_64、arm64。比Xcode11多了arm64,而arm64通常用于真机,因此在合并模拟器的.a和真机的.a的时候起了冲突。

解决方案:

打包的时候强制指定${CONFIG} ARCHS="i386 x86_64", Xcode 配置build settings->+user-defined->VALID_ARCHS = i386 x86_64,或者直接设置Architectures = i386 x86_64


问题现象3:

报错1:DemoApp.xcodeproj The linked framework **framework' is missing one or more architectures required by this target: armv7.
报错2:ld: in **, building for iOS, but linking in object file (**) built for iOS Simulator, file '*' for architecture arm64

问题分析:

既然Xcode12模拟器默认支持了arm64,那么我们直接打出一个模拟器的FrameWork,真机是否可以直接使用?

解决方案:

答案是不可以。真机无法使用模拟器的arm64。报错1是直接使用模拟器的包编译会提示找不到armv7,改了build active architecture only后报错2。
Xcode12 提到了Universal APP(通用APP),MacOS11 的Apple芯片支持手机应用在电脑上运行。推测可能是苹果为新电脑做的适配,假设新电脑支持arm64,那就应该支持编译arm64的模拟器和真机。开发者大会有提及,但是细节不明。
解决方案:暂时只能老老实实回退到不包含arm64的模拟器包



解决方法:spec 文件移除指定cpu ,否则校验报错,好像是xcode

 spec.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
 spec.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

1.错误

xcode12更新之后,如果私有库引入了第三方库,pod repo push时会出现以下错误:

ld: building for iOS Simulator, but linking in dylib built for iOS, file ' XXX ' for architecture arm64
clang: error: linker command failed with exit code 1

2.原因

这是因为新xcode为了适配即将发布arm架构芯片mac,会在编译的时尝试生成模拟器版本的arm64架构的可执行文件。然而引入的第三方SDK还没来得及更新,老版本的第三方SDK并不包含模拟器版本的arm64架构可执行文件,所以在链接的时候就会失败,上面的错误提示也能看出端倪。简单来说就以下两个原因:

1.新xcode要生成模拟器版本的arm64架构可执行文件

2.引入的第三方sdk并没有更新,不存在模拟器版本的arm64架构可执行文件

3.解决方案:

解决方法分一下几种情况:

1.使用第三方SDK生成动态动态库:

这种情况出现在swift项目中,为了解决第三方静态库在组件化中出现传递依赖等问题,把第三方SDK的静态库编译成一个动态库,制作方案可以参考组件化-动态库实战,这里就不做详细介绍了。这种情况需要在项目的target -> BuildSettings->EXCLUDED_ARCHS添加剔除模拟器arm64架构配置:

image

2.普通私有库pod repo push时报错:

这种情况需要在podesc文件添加一下代码:
s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }

参考资料

3. 如果项目使用了cocoapods需要在项目的Podfile里面添加代码段,然后执行pod install

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

相关推荐

spring利用spring.handlers解析自定义配置(spring validation 自定义)

一、问题我们在spring的xml配置文件里经常定义各种各样的配置(tx、bean、mvc、bean等等)。以及集成第三方框架时,也会看到一些spring之外的配置,例如dubbo的配置、securi...

「Spring源码分析」AOP源码解析(上篇)(spring源码深度解析(第2版))

前言前面写了六篇文章详细地分析了SpringBean加载流程,这部分完了之后就要进入一个比较困难的部分了,就是AOP的实现原理分析。为了探究AOP实现原理,首先定义几个类,一个Dao接口:1&nbs...

Spring 解析注册BeanDefinition这一篇就Over
Spring 解析注册BeanDefinition这一篇就Over

一、简介:学习过Spring框架的人一定都会听过Spring的IoC(控制反转)、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC、...

2023-03-20 14:53 xiyangw

域、模块、空间、闭包,你真的懂了吗?(模块控制域与作用域的关系)

Javascript有一个特性叫做域。尽管对于初学者来说理解域是有难度的,但我会尽力用最简单的方式让你理解域。理解域能让你的代码更优秀,减少错误,及有助于你做出更强大的模式设计。什么是域域是在运行时,...

这一次搞懂Spring自定义标签以及注解解析原理
这一次搞懂Spring自定义标签以及注解解析原理

前言在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如...

2023-03-20 14:53 xiyangw

前端基础进阶(七)-前端工程师最容易出错的问题-this关键字
前端基础进阶(七)-前端工程师最容易出错的问题-this关键字

我们在学习JavaScript的时候,因为对一些概念不是很清楚,但是又会通过一些简洁的方式把它给记下来,那么这样自己记下来的概念和真正的概念产生了很强的偏差.当...

2023-03-20 14:52 xiyangw

深入K8s:守护进程DaemonSet及其源码分析(k8s 进程)
深入K8s:守护进程DaemonSet及其源码分析(k8s 进程)

建议学习:膜拜!阿里内部都在强推的K8S(kubernetes)学习指南,不能再详细了最近也一直在加班,处理项目中的事情,发现问题越多越是感觉自己的能力不足,...

2023-03-20 14:52 xiyangw

Spring 是如何解析 bean 标签的?(spring beans标签)
Spring 是如何解析 bean 标签的?(spring beans标签)

前情回顾上回「SpringIoC容器初始化(2)」说到了Spring如何解析我们定义的<bean>标签,代码跟进了一层又一层,跋山涉水,...

2023-03-20 14:52 xiyangw

快速了解JavaScript文本框操作(javascript文本框代码)
快速了解JavaScript文本框操作(javascript文本框代码)

HTML中使用<input>元素表示单行输入框和<textarea>元素表示多行文本框。HTML中使用的<input&...

2023-03-20 14:51 xiyangw

荐读|30道JavaOOP面试题,可以和面试官扯皮了
荐读|30道JavaOOP面试题,可以和面试官扯皮了

面试是我们每个人都要经历的事情,大部分人且不止一次,今天给大家准备了30道JavaOOP面试题,希望能够帮助到对Java感兴趣的同学,让大家在找工作的时候能够...

2023-03-20 14:51 xiyangw

源码系列——mybatis源码刨析总结,下(mybatis源码分析)
源码系列——mybatis源码刨析总结,下(mybatis源码分析)

接上文简答题一.1.Mybatis动态sql是做什么的?1.动态sql就是根据条件标签动态的拼接sql,包括判空,循环,拼接等2.哪些动态sql?动态sql大...

2023-03-20 14:50 xiyangw

Java面试题(第二弹)(java面试题及答案整理)
Java面试题(第二弹)(java面试题及答案整理)

1.抽象类和接口的区别?接口可以被多重implements,抽象类只能被单一extends接口只有定义,抽象类可以有定义和实现接口的字段定义默认为:public...

2023-03-20 14:50 xiyangw

mybatis3 源码深度解析-动态 sql 实现原理(sql数据库基础知识)
mybatis3 源码深度解析-动态 sql 实现原理(sql数据库基础知识)

大纲动态sql使用示例SqlSource和BoundSql以及实现类LanguageDriver以及实现类SqlNode以及实现类动态sql解...

2023-03-20 14:50 xiyangw

第43节 Text、Comment及CDATASection(第43节 Text、Comment及CDATASection)
第43节 Text、Comment及CDATASection(第43节 Text、Comment及CDATASection)

本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。文本节点用Text类型表示,包含的是可以按字面解释...

2023-03-20 14:49 xiyangw

Qt读写三种文件(qt读取文件数据并赋值给变量)

第一种INI配置文件.ini文件是InitializationFile的缩写,即初始化文件。除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要...

取消回复欢迎 发表评论: