提问者:小点点

如何修复IOS/XCode生成错误,未定义符号`__c.nsurlSession.DataTaskPublisher`?


当添加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项目,不确定这是否相关。


共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。

另外,我们添加的依赖项需要Swift5.1,因为它与Swift的旧版本不是二进制兼容的。 因为出于某种原因,react-native init显式地将Swift5.0添加到项目中。 也许这里的具体问题是编译代码的命名约定发生了变化,Swift 5.1期望urlSession.datataskPublisher而不是nsurlSession.datataskPublisher? 谁知道呢。。

只需清除library_search_paths,使其为空,就为我们修复了这个问题。 没有它,构建在其他各个方面都可以正常工作。

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