Firebase未定义符号的x86_64架构问题

49

我正在iOS项目中使用Firebase,当我试图编译针对iPhone 6或7模拟器的代码进行测试时,我遇到了以下链接错误。

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_GTMSessionUploadFetcher", referenced from:
      objc-class-ref in FirebaseStorage(FIRStorageUploadTask_d5061b1e2b5f1bb249816cc5fc42ff62.o)
  "_OBJC_CLASS_$_GTMLogger", referenced from:
      objc-class-ref in FirebaseMessaging(GIPReachability_ae5504e4a6a28a1d8997c6f38e8bff8b.o)
  "_kGTMSessionUploadFetcherStandardChunkSize", referenced from:
      -[FIRStorageUploadTask enqueue] in FirebaseStorage(FIRStorageUploadTask_d5061b1e2b5f1bb249816cc5fc42ff62.o)
  "_GTMFetcherStandardUserAgentString", referenced from:
      -[FIRAuthBackendRPCIssuerImplementation init] in FirebaseAuth(FIRAuthBackend_ea73237c278bd1b78e1c76db2a16775a.o)
  "_OBJC_CLASS_$_GTMSessionFetcher", referenced from:
      objc-class-ref in FirebaseStorage(FIRStorageDownloadTask_c390366e83519f6636ca985ecb70e5d0.o)
      objc-class-ref in FirebaseStorage(FIRStorage_691ea9ac7cb4d224d37df2ff8a911989.o)
  "_OBJC_CLASS_$_GTMSessionFetcherService", referenced from:
      objc-class-ref in FirebaseAuth(FIRAuthBackend_ea73237c278bd1b78e1c76db2a16775a.o)
      objc-class-ref in FirebaseStorage(FIRStorage_691ea9ac7cb4d224d37df2ff8a911989.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我正在使用 Xcode 8.2.1,swift 3.0,并且我也在我的项目中使用以下 Pod 文件

pod 'Braintree'
pod 'Firebase/Auth'
pod 'Firebase/Database'
pod 'Firebase/Core'
pod 'Firebase/Storage'
pod 'Firebase/Messaging'
pod 'Firebase/RemoteConfig'
pod 'GeoFire', :git=>'https://github.com/firebase/geofire-objc.git'
pod 'ObjectMapper', '~> 2.2'

我已经执行了pod update以确保没有过期的内容,但是没有成功。当我使用iPhone 4或5模拟器时,代码可以编译并运行得很好。

编辑:

我已将“Build Active Architectures”设置为“No”,在有效架构中列出了arm64、armv7和armv7s,但现在Objectmapper失败了,尽管在文件中声明了 import ObjectMapper

 Use of undeclared type 'Mappable'
任何帮助都将不胜感激!提前谢谢。 George.

1
在XCode中标记“构建设置>仅构建活动体系结构>是”。 - Sachin Vas
2
抱歉,应该是“不”。 - Sachin Vas
我刚试了一下,但现在我得到了更多类似于之前的错误。 - gdev
我认为我的问题是在我的有效架构下有 arm64。我没有自己放置它,我只是注意到它的存在。现在我已经将其删除,它正在编译。我希望通过删除这个东西没有搞砸其他任何东西。 - gdev
就我个人而言,我曾经有一个项目使用了多种框架和pods。我将所有内容都转移到了pods上,并解决了构建问题。 - Adam Mendoza
显示剩余5条评论
20个回答

57

我刚刚发现一个类似的问题,并通过清除 Pod-Cache 解决了它。

清除 CocoaPods 缓存

pod deintegrate && pod cache clean --all

重新安装 Pods

pod install


4
删除./Pods/文件夹并运行pod install同样起作用 :) - Axel Guilmin
对我没有用。当我添加[[FIRCrashlytics crashlytics] log:@"Simple string message"];时,我遇到了FirebaseCrashlytics的错误。 - Rohit Singh

28

对我来说,我刚刚将 Firebase 框架安装到 Xcode 中,由于其他无法解决的问题,我没有使用 CocoaPods。构建后,出现类似上述错误的“找不到 x86_64 架构的符号”的错误。(可能是因为我正在虚拟机上使用 Xcode)

然后我必须手动转到General - Linked Frameworks and Libraries并添加:

libsqlite3.tbd,libz.tbd,libc++.tbd

以使项目正常工作。


我只需要添加 libsqlite3.tbd - Joshua
5
对我来说,重要的文件是libsqlite3.tdb、libc++.tbd和StoreKit.framework。 - Josh
1
libsqlite3.tbdlibz.tbdlibc++.tbdStoreKit.framework - raurora
我还需要在“构建设置/其他链接器标志”中进行-ObjC条目。 - self.name
2
根据 Firebase 的 README,添加这些链接库应该是不必要的。这些库被一个或多个 Firebase 框架使用。对我而言有效的方法是创建一个桥接头文件,在其中添加 "#import Firebase.h",并在“Build Settings > Objective-C Bridging Header”中引用它。 - Mike Taverne
对于 Xcode 11 及以上版本,构建阶段 -> 链接二进制文件库。 - Shebin Koshy

13
我尝试了"清除Cocoapods缓存"和"删除派生数据"的解决方案,但都没有起作用。对我有用的是在Carthage设置中找到的一步(我仍在使用Cocoapods)。
请将$(OTHER_LDFLAGS) -ObjC标志添加到"Build Settings"中的"Other Linker Flags"中。
您可以在此处查看该步骤:https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md 我的信息
安装:Cocoapods | SDK:FirebaseAnalytics(6.1.2)| IDE:Xcode 11.0 | macOS:Mojave 10.14.5 Beta |语言:Swift 4.2 |平台目标:iOS 11.0+

12

似乎是派生数据出现了故障。我退出了Xcode,然后删除了/Users/USER_NAME/Library/Developer/Xcode/PROJECT_NAME下的所有派生数据。

重新启动Xcode,进行编译,一切都按预期工作,无需更改任何Active Architecture Only或其他内容。


9
在终端中执行以下操作:rm -rf ~/Library/Developer/Xcode/DerivedData - Leo

12

在使用 CocoaPods 安装 Firebase 的过程中,我遇到了类似的问题:

https://firebase.google.com/docs/ios/setup?hl=es-419#prerequisites

我在安装 pods 的时候收到了一个警告:

pod 'Firebase/Analytics' pod 'Firebase/Auth'

[!] The target `myTarget [Debug]` overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Pods.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The target `myTarget [Release]` overrides the `OTHER_LDFLAGS` build setting defined in `Pods/Pods.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

编译时,我遇到了几个文件的错误:

Undefined symbols for architecture x86_64:

在看到当前答案之前,我尝试了以下答案的解决方案,并且它完美地解决了我的问题:

target覆盖了`Pods/Pods.xcconfig`中定义的`OTHER_LDFLAGS`构建设置

基本上,这个解决方案是(由@Ankish Jain解释):

进入你的目标构建设置 -> 其他链接器标志 -> 双击 -> + 按钮。将 $(inherited) 添加到新行。

之后,我成功编译了,并且新的标志自动添加到了构建设置中。


1
非常感谢!我在安装 Firebase pod 时也遇到了那些警告,但我只是忽略了它并且一直在努力使分析生效。作为一个非 iOS 开发者,其他回答对我来说都不太合适。 - Limpuls
1
完成此操作后,请不要忘记删除派生数据并清理项目。 - Ahmadreza

8

我也遇到过这个问题...
在构建设置中的其他链接器标志中添加 $(inherited),现在一切正常了。


5

我尝试了这个问题中的解决方案,但都没有起作用。我还在Stack Overflow和GitHub issues找到了其他帖子,但也没有帮助。我正在使用Xcode 9.2,Swift 4和最新版本的CocoaPods。以下方法对我有效:

首先,我的podfile只包含一个Firebase pod,因为我目前只使用Analytics,但如果你使用更多,则解决方法应该是相同的。
pod 'Firebase/Core'

其次,如文档所述,请确保将-ObjC添加到其他链接器标志中。我在项目和目标级别的构建设置中都这样做了,它们不同。

第三个步骤最重要,在项目级别的构建设置中,Other Linker Flags,添加以下内容

-framework

"FirebaseCore"

-framework

"FirebaseAnalytics"

-framework

"FirebaseInstanceID"

-framework

"FirebaseNanoPB"

-framework

"FirebaseCoreDiagnostics"

-framework

"nanopb"


我尝试了所有的方法,但都没有成功 :( 你还需要做些什么吗?(只是想使用分析工具) - Chris Byatt

5

我在按照不使用CocoaPods的整合步骤(https://firebase.google.com/docs/ios/setup#frameworks)时遇到了同样的问题,其他答案都没有帮助到我。

对我有用的是从目标构建设置中删除Other Linker Flags中的-ObjC。

我仍然不确定为什么这样做有效,即使在添加此标志的步骤上有明确说明,只是想分享一下我的经验,以尝试帮助其他人。


+1 这对我有效。在 Xcode 11 和 12 beta 中进行了测试,并使用 Cocoapods 导入。这也修复了我在使用 AppCenter pod 时遇到的类似错误。 - Jon Willis

3

我曾遇到同样的问题,我的问题在于我手动导入了FirebaseMessaging框架。我通过下载整个Firebase SDK并手动将Messaging框架导入项目中来实现的(我没有使用Cocoapods或Carthage)。我没有导入同一文件夹中的其他框架“Protobuf.framework”。一旦添加了Protobuf并确保目标成员包括我的项目目标,它就可以工作了。


2
当我手动集成Firebase而不使用CocoaPod并为模拟器构建时,我遇到了相同的错误。(仅为设备构建没有问题。)虽然这是一个旧问题,但与此相关,所以我展示一下我的最新解决方案。首先,我放弃了仅为模拟器构建的想法。虽然构建需要太长时间,但我将“Build Active Architecture Only”设置为“No”,以构建包括模拟器在内的所有目标。此外,我在Build Settings中的“Excluded Architectures”中添加了“Any iOS Simulator SDK - arm64”,因为我的Mac OS架构不是“arm64”而是“x86_64”。如有必要,您还应该添加“Any iOS Simulator SDK - i386”。Firebase包含“i386”架构,但其他一些广告SDK不再支持“i386”。这是我可以接受的解决方案。

我发现有时候即使这个解决方案也不起作用。如果您无法链接到x86_64框架,您应该删除项目中的“bin”和“build”文件夹,然后重新构建。那样就可以了。 - deve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接