静态 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 Type
和Static 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 项目中集成 swift 框架,都使用 cocoapods
通过 cocoapods 在 swift 项目(iOS 8.0 目标)中添加 Facebook Pop 是不可能的