【问题标题】:How to fix iOS/Xcode build error, undefined symbol `__C.NSURLSession.DataTaskPublisher`?如何修复 iOS/Xcode 构建错误,未定义符号`__C.NSURLSession.DataTaskPublisher`?
【发布时间】:2020-06-19 09:50:57
【问题描述】:

在添加 cocoapods 依赖项时,我们开始收到如下构建错误:

Undefined symbols for architecture x86_64:
  "type metadata accessor for (extension in Foundation):__C.NSURLSession.DataTaskPublisher", referenced from:
      (extension in TinyNetworkingObjcIO):__C.NSURLSession.load<A>(TinyNetworkingObjcIO.Endpoint<A>) -> Combine.AnyPublisher<A, Swift.Error> in libTinyNetworkingObjcIO.a(Endpoint.o)
      lazy protocol witness table accessor for type (extension in Foundation):__C.NSURLSession.DataTaskPublisher and conformance (extension in Foundation):__C.NSURLSession.DataTaskPublisher : Combine.Publisher in Foundation in libTinyNetworkingObjcIO.a(Endpoint.o)
  "protocol conformance descriptor for (extension in Foundation):__C.NSURLSession.DataTaskPublisher : Combine.Publisher in Foundation", referenced from:
      lazy protocol witness table accessor for type (extension in Foundation):__C.NSURLSession.DataTaskPublisher and conformance (extension in Foundation):__C.NSURLSession.DataTaskPublisher : Combine.Publisher in Foundation in libTinyNetworkingObjcIO.a(Endpoint.o)
  "(extension in Foundation):__C.NSURLSession.dataTaskPublisher(for: Foundation.URLRequest) -> (extension in Foundation):__C.NSURLSession.DataTaskPublisher", referenced from:
      (extension in TinyNetworkingObjcIO):__C.NSURLSession.load<A>(TinyNetworkingObjcIO.Endpoint<A>) -> Combine.AnyPublisher<A, Swift.Error> in libTinyNetworkingObjcIO.a(Endpoint.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

在我们向 Podfile 添加新的依赖项后,这些错误看起来有点“突如其来”,没有关于导致它们的原因以及它源自代码的哪一部分的信息,它们只是在构建后打印出来的在链接阶段,现在失败了。

这个错误是什么意思?可以做些什么来尝试解决它?

这恰好是一个 react-native 生成​​的 XCode 项目,不确定是否相关。

【问题讨论】:

    标签: ios swift xcode react-native


    【解决方案1】:

    问题似乎是我们由react-native init 生成的项目将LIBRARY_SEARCH_PATHS 设置为以下内容:

    LIBRARY_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)" "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)" "$(inherited)"
    

    如果你生成一个普通的 Xcode 项目,LIBRARY_SEARCH_PATHS 没有设置。

    事实证明,我们添加的依赖项需要 Swift 5.1,因为它与旧版本的 Swift 二进制不兼容。这导致了损坏,因为 swift 5.0 出于某种原因被react-native init 明确添加到项目中。也许这里的具体问题是编译代码的命名约定已经改变,Swift 5.1 需要URLSession.DataTaskPublisher 而不是NSURLSession.DataTaskPublisher?谁知道..

    只需清除 LIBRARY_SEARCH_PATHS 使其为空,即可为我们解决问题。没有它,构建在其他所有方面都可以正常工作。

    相关拉取请求:https://github.com/facebook/react-native/pull/29178

    【讨论】:

    • 谢谢,这为我节省了很多时间
    • 感谢您的好话 :) 这绝对让我浪费了一个工作日的大部分时间......这里是关于 SO 的晦涩不受欢迎的问题,它已经在世界各地节省了无数小时!
    • 谢谢。你救了我。就我而言,设置如下:LIBRARY_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)" "$(inherited)"
    • 感谢它为我所做的工作!!!! $(inherited) 移除它
    猜你喜欢
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多