我正在实现一个用Swift编写的iOS框架。该框架对基于C的静态库具有内部依赖性。为了使其工作并根据一些教程,我制作了一个类似于以下内容的模块图:
framework module Module {
umbrella header "Module.h"
explicit module ModuleDep {
private header "header1.h"
}
export *
}
基于此,我可以像这样在Swift中包含C代码:
import Module.ModuleDep
手动导出框架时,一切似乎都可以正常工作。可以肯定的是,我想通过代码可见性(更易于调试)为我的框架提供Cocoapods支持。使它起作用的podspec是这样的(省略了某些部分):
Pod::Spec.new do |s|
s.platform = :ios
s.ios.deployment_target = '12.0'
s.module_map = "Module.modulemap"
s.source_files = "Module/*.{h,swift}", "ModuleDep/*.h"
s.vendored_libraries = "ModuleDep/*.a"
s.swift_version = "5.1"
end
据我了解,vendored_libraries
是在您为用户提供的工件时使用的,这就是为什么我不喜欢这种解决方案的原因。
我也尝试过这个规格变体:
Pod::Spec.new do |s|
s.platform = :ios
s.ios.deployment_target = '12.0'
s.module_map = "Module.modulemap"
s.source_files = "Module/*.{h,swift}", "ModuleDep/*.h", "ModuleDep/*.a"
s.swift_version = "5.1"
end
但无法编译。
那么正确的方法是什么?还是我做错了什么?
答案 0 :(得分:2)
由于您使用静态库作为依赖项,因此必须在podspec文件中将其指定为库。这就是为什么第二种方法不起作用的原因,因为它是一个库而不是源文件。
如docs vendored_libraries
中所述,适用于Pod随附的库。同样在您的情况下,基于C的静态库是一个依赖项,必须随Pod一起提供。因此,在您的情况下,可以使用vendored_libraries
。