Xcode12环境CocoaPods校验和打包出现的问题

CocoaPods校验的报错

最近,我执行pod lib lint --verbose --no-clean --verbose --allow-warnings校验CocoaPods,结果却是一个以前没有见过的错误:

ld: building for iOS Simulator, but linking in dylib built for iOS, file '/var/folders/pn/4cgjvr1j7mzbnl55pfnzlgr00000gq/T/CocoaPods-Lint-20200929-48311-11st24n-DroneKit/Pods/DJI-SDK-iOS/iOS_Mobile_SDK/DJISDK.framework/DJISDK' for architecture arm64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

GitHub Issue:https://github.com/CocoaPods/CocoaPods/issues/10104

CocoaPods打包的报错

在执行pod package时也出现了跟arm64架构有关的错误

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

Github Issue:https://github.com/CocoaPods/cocoapods-packager/issues/259

出现问题的原因

根据这篇Medium的文章,由于我们的项目对于架构的设置是默认的:ARCHS_STANDARD,随着Xcode 12 的正式发布,苹果在这个字段里面加入了arm64架构的模拟器,⚠️注意,是模拟器。

随着苹果的Apple Silicon计划和M1芯片的推出,Xcode为了适配arm64架构的Mac,让M1的用户可以在模拟器上调试,苹果加入了arm64架构模拟器的字段,导致了CocoaPods校验和打包的报错。

详细的原因

至于详细的原因,这篇StackOverFLow的回答给出了答案,下面粘贴部分内容并翻译(大部分使用DeepL翻译后校对):

The Build Settings editor no longer includes the Valid Architectures build setting "VALID ARCHS", and its use is discouraged. Instead, there is a new Excluded Architectures build setting (EXCLUDED ARCHS)

构建设置编辑器不再包含有效的架构构建设置 "VALID ARCHS",并且不鼓励使用它。取而代之的是一个新的排除架构构建设置(EXCLUDED ARCHS)。

Xcode 12 is actually the stepping stone for Apple Silicon which unfortunately is not yet available. But with that platform, we are gonna get arm64 based macOS where simulators will also run on arm64 architecture unlike the present Intel-based x86_64 architecture.

Xcode 12其实是苹果Silicon的垫脚石,可惜目前还没有上市。但有了这个平台,我们使用基于arm64的macOS,其中模拟器也将运行在arm64架构上,而不像现在基于英特尔的x86_64架构。

Xcode usually depends on the "Run Destination" to build its libraries/apps. So when a simulator is chosen as the "Run Destination", it builds the app for available simulator architectures and when a device is chosen as the "Run Destination" it builds for the architecture that the device supports (arm*).

Xcode通常依赖于 "运行目的地 (Run Destination)"来构建它的库/应用程序。因此,当模拟器被选择为 "运行目的地(Run Destination) "时,它会为可用的模拟器架构构建应用程序,而当设备被选择为 "运行目的地 "时,它会为设备支持的架构(arm*)构建。

xcodebuild, in the Xcode 12+ build system, considers arm64 as a valid architecture for the simulator. So when a simulator is chosen as the run destination, it can potentially try to compile/link your libs/apps against arm64 based simulators as well (not available yet). So it sends clang(++) some -target flag like arm64-apple-ios13.0-simulator in --- format and clang tries to build/link against arm64 based simulator that eventually fails on Intel-based mac.

xcodebuild,在Xcode 12+构建系统中,认为arm64是模拟器的有效架构。所以当一个模拟器被选择为运行目标时,它有可能会尝试对基于arm64的模拟器也编译/链接你的lib/apps(目前还没有)(2021.3.16注:已经有了)。因此,它向clang(++)发送一些-target标志,如arm64-apple-ios13.0-simulator,格式为----,然后clang就会尝试对基于arm64的模拟器进行编译/链接,最终在基于Intel的Mac上失败。

But xcodebuild tries this only for Release builds. Why? Because, "Build Active Architecture Only (ONLY_ACTIVE_ARCH)" build settings is usually set to "No" for the "Release" configuration only. And that means xcodebuild will try to build all architectural variants of your libs/apps for the selected run destination for release builds. And for the Simulator run destination, it will includes both x86_64 and arm64 now on, since arm64 in Xcode 12+ is also a supported architecture for simulators to support Apple Silicon.

但xcodebuild只在Release构建时才会尝试这样做。为什么呢?因为,"仅构建活动架构(ONLY_ACTIVE_ARCH) "构建设置通常只在 "Release "配置中设置为 "No"。这意味着xcodebuild将尝试为所选的运行目标构建发行版构建的所有lib/apps的架构变体。对于模拟器的运行目标,它将包括x86_64和arm64,因为在Xcode 12+中arm64也是模拟器支持的架构,以支持Apple Silicon。

Simply putting, Xcode will fail to build your app anytime it tries the command line, xcodebuild, (which defaults to release build, see the general tab of your project setting) or otherwise in release mode. So a simple workaround to this issue is to set "Build Active Architecture Only (ONLY_ACTIVE_ARCH)" to Yes in your libraries/apps, even for release mode.

简单地说,Xcode在任何时候尝试命令行、xcodebuild(默认为release build,见项目设置的general选项卡)或其他release模式下,都会导致你的应用程序构建失败。所以这个问题的一个简单的变通方法就是在你的库/应用中把 "仅构建活动架构(ONLY_ACTIVE_ARCH)"设置为 "是",即使是发布模式。

解决方案

目前似乎只有临时的解决方案,就是在podspec文件里添加两行绕过arm64架构模拟器的配置:

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

根据大家的描述:

This will eventually be a problem when we are running on Apple Silicon Macs, but for now we'll be OK.

一个疑问

如果在podspec上设置绕开了arm64架构的模拟器,那开发者不就没有办法在M1的Mac上面使用模拟器调试了吗?该怎么样让自己的库适配arm64的模拟器呢?

延伸阅读

  1. Deep dive — Xcode Build Settings
  2. Wrestling with Xcode 12 and ARM64
  3. 关于XCode12 + iOS14的Cell ContentView 显示层级bug的探究。
  4. mac M1芯片 arm64架构 pod安装踩坑记录
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,362评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,013评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,346评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,421评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,146评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,534评论 1 325
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,585评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,767评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,318评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,074评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,258评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,828评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,486评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,916评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,156评论 1 290
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,993评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,234评论 2 375

推荐阅读更多精彩内容