Jon*_*lis 5 xcode clang dyld ios swift
我有一个二进制 Swift xcframework,它引用了其他两个开源 Swift 框架(从源代码构建)。
我的框架及其依赖项是在BUILD_LIBRARY_FOR_DISTRIBUTION启用该选项的情况下构建的(为了支持模块稳定性)。
此设置多年来一直运行良好,但现在在 Xcode 12.5 或更高版本中构建我的框架时,当在 Xcode <12.5 中编译使用该框架的应用程序时,我收到以下 dyld 错误:
dyld: Symbol not found: __ZN5swift34swift50override_conformsToProtocolEPKNS_14TargetMetadataINS_9InProcessEEEPKNS_24TargetProtocolDescriptorIS1_EEPFPKNS_18TargetWitnessTableIS1_EES4_S8_E
Run Code Online (Sandbox Code Playgroud)
我似乎不是唯一遇到这个问题的人。Github 上提供了许多在 Xcode 12.5 中遇到相同问题的其他 框架。
这里建议这个问题是由以下警告引起的,显然现在导致了这个致命错误:
不推荐使用“class”关键字进行协议继承;使用“AnyObject”代替
我注意到我的案例(Starscream)中涉及的受影响的依赖项尚未将 class 关键字更改为 AnyObject,但是我(尚未)还没有验证这绝对是原因。
不幸的是,关于这个问题的文档很少,但随着人们升级到 Xcode 12.5+,并且针对这个新版本构建了更多的二进制框架,它似乎可能非常普遍并且越来越普遍。
除了降级到 Xcode 12.4 之外,有谁知道如何解决/缓解此问题?
我们在更新到Xcode 12.5. 根据 Apple 的说法,“模块稳定性”仅确保旧版本 Xcode 中构建的框架能够在新版本 Xcode 中运行。直到 之前12.5,它也可以方便地以相反的方式工作,但似乎他们决定做出一些突破性的改变。
我们一直在做的解决方法是使用xcodebuild12.4 的系统来编译我们的框架依赖项,同时仍然使用12.5GUI 进行日常开发。切换到旧版本是通过从开发人员下载下载 Xcode并重命名它来完成的Xcode_12_4。
export DEVELOPER_DIR=/Applications/Xcode_12_4.app/Contents/Developer
尽管如此,由于模块稳定性的定义,我强烈建议使用您的框架官方支持的最低版本的 Xcode进行构建。(至少必须12.0提交到 App Store)这将确保任何人在较旧的 Xcode 版本中使用您的框架不会出现任何问题。
我知道这是一个非常令人失望的答案,但这可能是一个相当可持续的过程。iOS 上的框架开发似乎正在朝着要求开发人员使用xcodebuild他们期望实现者使用的最低版本的方向发展。
有时可以使用另一种解决方法:
通过从源代码构建依赖项可以避免此问题(假设其许可证允许)。我们Starscream从源代码构建并且效果很好。(即,如果他们发布源代码,则查看依赖项 GitHub,然后将其复制到框架中的目录中)
| 归档时间: |
|
| 查看次数: |
904 次 |
| 最近记录: |