#if canImport(CoreImage)在Swift Package Manager中不起作用

时间:2018-10-04 14:53:15

标签: swift ciimage swift-package-manager

我正在制作使用CoreImage的库。库支持Cocoapods,Carthage和Swift软件包管理器。

当我在Swift Package Manager中构建它时,出现此错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_CIFilter", referenced from:
      objc-class-ref in EIP67Code.swift.o
  "_OBJC_CLASS_$_CIImage", referenced from:
      objc-class-ref in EIP67Code.swift.o
ld: symbol(s) not found for architecture x86_64

当我使用#if canImport(CoreImage)

#if canImport(CoreImage)
import CoreImage
extension Web3 {
  public struct EIP67CodeGenerator {
    public static func createImage(from: EIP67Code, scale: Double = 1.0) -> CIImage {
      guard let string = from.toString().addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { return CIImage() }
      guard let data = string.data(using: .utf8, allowLossyConversion: false) else { return CIImage() }
      let filter = CIFilter(name: "CIQRCodeGenerator", parameters: ["inputMessage" : data, "inputCorrectionLevel":"L"])
      guard var image = filter?.outputImage else { return CIImage() }
      let transformation = CGAffineTransform(scaleX: CGFloat(scale), y: CGFloat(scale))
      image = image.transformed(by: transformation)
      return image
    }
  }
}
extension Web3.EIP67Code {
  public func toImage(scale: Double = 1.0) -> CIImage {
    return Web3.EIP67CodeGenerator.createImage(from: self, scale: scale)
  }
}
#endif

如果我使用#if os(iOS) || os(tvOS)

,效果很好

但是CoreImage可以在macOS上运行,所以我至少在迦太基/ cocoapods上仍然需要此代码

3 个答案:

答案 0 :(得分:0)

找不到任何解决方案,所以我只是在Package.swift中排除了此文件

gl_InstanceID

答案 1 :(得分:0)

也许您框架中依赖CoreImage的某些功能不支持默认的Package.swift macOS 10.10。尝试从macOS 10.12开始升级软件包支持。

let package = Package(
    name: "Example",
    platforms: [
      .macOS(.v10_12),
    ]
)

答案 2 :(得分:0)

这是一个链接器错误,对于已移动或更改名称的框架而言很明显。对于 CoreImage 的具体情况,您可以通过将部署目标设置为 macOS 10.12 或导入 QuartzCore 而不是 CoreImage 来解决问题。

如果您打开框架的 tbd 文件 ($(xcrun --sdk macosx --show-sdk-path)/System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage.tbd) 并找到以 $ld$install_name$os 开头的符号,则此框架受此错误影响,您要么需要使用更新的部署目标不是列表中最新的 install_name(在这种情况下,比 10.11 更近),或者您需要使用其旧名称(在此名称中为 QuartzCore)导入框架。