静态 Swift 框架未能通过 CocoaPods 验证,并显示“未定义的架构符号”

Posted

技术标签:

【中文标题】静态 Swift 框架未能通过 CocoaPods 验证,并显示“未定义的架构符号”【英文标题】:Static Swift framework fails CocoaPods validation with `Undefined symbols for architecture` 【发布时间】:2020-11-20 00:25:21 【问题描述】:

我正在使用 Xcode 12.2,并且正在开发一个 Swift 静态框架(最终嵌入在 .xcframework 中),我打算与 CocoaPods 一起交付。

我的问题目前不是应用项目中的 CocoaPods 集成(pod install 正常工作并且应用构建和运行),而是使用 pod lib lint 命令验证 pod。

lint 验证失败,日志包含以下内容:

ld: warning: Could not find or use auto-linked library 'swiftCoreGraphics'
ld: warning: Could not find or use auto-linked library 'swiftObjectiveC'
ld: warning: Could not find or use auto-linked library 'swiftUIKit'
ld: warning: Could not find or use auto-linked library 'swiftDarwin'
ld: warning: Could not find or use auto-linked library 'swiftDispatch'
ld: warning: Could not find or use auto-linked library 'swiftAVFoundation'
ld: warning: Could not find or use auto-linked library 'swiftAccelerate'
ld: warning: Could not find or use auto-linked library 'swiftCoreImage'
ld: warning: Could not find or use auto-linked library 'swiftCompatibilityDynamicReplacements'
    Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$__TtCs12_SwiftObject", referenced from:
[...]

和日志包含的一样 Undefined symbols for architecture arm64

我的.podspec 文件如下

Pod::Spec.new do |s|
  s.name             = 'MyFramework'
  s.version          = '1.0.0'

  s.source           =  :git => 'https://url-to-repo.git', :tag => s.version.to_s 
  
  s.ios.deployment_target = '12.0'
  s.platform = :ios
  s.swift_version = '5.0'
    
  s.requires_arc = true
  s.static_framework = true
      
  s.ios.vendored_frameworks = "MyFramework.xcframework"
  
  s.frameworks = 'AVFoundation', 'Accelerate', 'CoreGraphics', 'CoreImage'
  
  s.ios.library = 'z', 'c++'
end

我的猜测是 CocoaPods 创建的项目是使用 Objective-C 的,可能不会引用 Swift 编译器或库。 但我不知道如何解决这个问题..

我已经为此浪费了好几天,任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

你是对的,对于 podspec 的验证,CocoaPods 创建了一个 Objective-C Xcode 项目。

具有Mach-O TypeStatic Library 的纯Swift 框架在CocoaPods 方面确实是一个问题,因为它还不能处理它。 在这种情况下,没有链接 Swift 库。

CocoaPods repository 上已打开并解决了一个问题,CocoaPods version 1.11 将提供修复程序

在此 CocoaPods 1.11 发布之前,以下是本期分享的解决方法(我没有尝试过):

Include a .swift file in your pod

Add tests to the podspec, having those tests depend on a swift pod, without adding any source files, and execute pod lib lint with the option --skip-tests

在你的 podspec 添加:

  # Adding tests with a swift dependency is a workaround in order to make pod lib lint work
  # See: https://github.com/CocoaPods/CocoaPods/issues/8649
  spec.test_spec 'Tests' do |spec|
    spec.dependency 'Result', '~> 5.0'
  end  

另外,如果lint 失败,则没有选项允许pod push 失败,原因很简单,它将被视为反模式。

【讨论】:

以上是关于静态 Swift 框架未能通过 CocoaPods 验证,并显示“未定义的架构符号”的主要内容,如果未能解决你的问题,请参考以下文章

Swift.h 文件未找到 CocoaPods 1.5.3

在 swift 项目中集成 swift 框架,都使用 cocoapods

Swift开源框架发布到CocoaPods

通过 cocoapods 在 swift 项目(iOS 8.0 目标)中添加 Facebook Pop 是不可能的

Xcode Swift:使用使用 pod (CocoaPods) 的框架时出错

Swift 和 Cocoapods - 缺少必需的模块