一、背景
将Swift工程依赖的三方库生成xcframework二进制库格式后,制作为pod私有库,然后工程改为依赖这个pod私有库。
然后执行pod install,报错:
The ‘Pods-XXX’ target has transitive dependencies that include statically linked binaries: xxxx.xcframework
.
Pods-XXX具有可传递的依赖项,依赖项中包含了静态链接的二进制文件。
- transitive dependencies
在Cocoapods
的依赖结构中,某个库所依赖的库称为直接依赖项,这些直接依赖项所依赖的其他库称为传递依赖项。
简单来说,如果 Pods-XXX 中的一个库A依赖了另一个库B,那么B就是库A的直接依赖项,而如果库B又依赖了其他库C和D,那么C和D就是 Pods-XXX 的传递依赖项。
在这种情况下,当您编译Pods-XXX时,编译器需要将所有传递依赖项的代码一起编译并打包到最终生成的可执行文件中。
二、 报错的原因及解决
- 报错的原因
通常是由于动态库和静态库之间的冲突导致的。你的 Podfile 中的某些其他依赖可能已经使用了静态库(可能是.podspec文件中写了s.static_framework = true
),并与你的xcframework
冲突。一般这个冲突是由于构架不匹配:xcframework
支持多个架构的二进制文件,但静态库通常只提供单个架构的二进制文件。如果你的静态库和xcframework
之间的架构不匹配,就会导致冲突。
解决方法
办法一:
将依赖了xcframework库的私有库改为动态库(s.static_framework = false
)。
- 方法二:绕过CocoaPods静态库传递依赖检查机制。
修改podfile,增加如下代码
pre_install do |installer|
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
end
说明:
这段代码使用 Ruby 的元编程方式在 Pod 库中的 Pod::Installer::Xcode::TargetValidator 类中定义了一个名为 verify_no_static_framework_transitive_dependencies 的空方法。
具体来说,这是使用了 Ruby 中的 define_method 方法,它可以动态地为某个类添加一个方法。在这里,通过使用 define_method 方法,我们可以将一个名为 :verify_no_static_framework_transitive_dependencies 的方法添加到 ‘Pod::Installer::Xcode::TargetValidator’ 类中。
在这个方法中,并没有具体的实现代码,而是一个空方法。这是因为这个方法需要在运行时被 CocoaPods 内部的其他方法调用,以实现检查静态库传递依赖的功能。
这种做法可以绕过 CocoaPods 实际代码中对 verify_no_static_framework_transitive_dependencies 的检查机制,从而设置该选项为 true,以验证 CocoaPods 依赖是否存在静态库传递依赖。也就是说,通过这段代码,我们可以使用静态库作为 CocoaPods 直接依赖,同时仍然开启 verify_no_static_framework_transitive_dependencies 检查机制,使得 CocoaPods 仍然可以检查传递依赖是否符合要求。
需要注意的是,这种做法并不推荐使用,因为绕过 CocoaPods 检查机制可能会导致其他问题的出现。通常来说,我们应该尽可能避免静态库的传递依赖,并且始终推荐使用动态库来避免相关的问题。