在 Xcode 6.3 (Swift) 中使用 Parse 和 Facebook 框架编译错误

Posted

技术标签:

【中文标题】在 Xcode 6.3 (Swift) 中使用 Parse 和 Facebook 框架编译错误【英文标题】:Compile Error using Parse and Facebook Frameworks in Xcode 6.3 (Swift) 【发布时间】:2015-04-20 01:55:34 【问题描述】:

我正在尝试使用 Xcode 6.3 将 Parse 和 Facebook 的 SDK 与我的应用程序集成,并在尝试构建时遇到这些错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_FBSDKAppEvents", referenced from:
      __TMaCSo14FBSDKAppEvents in AppDelegate.o
  "_OBJC_CLASS_$_FBSDKApplicationDelegate", referenced from:
      __TMaCSo24FBSDKApplicationDelegate in AppDelegate.o
  "_OBJC_CLASS_$_PFAnalytics", referenced from:
      __TMaCSo11PFAnalytics in AppDelegate.o
  "_OBJC_CLASS_$_PFFacebookUtils", referenced from:
      __TMaCSo15PFFacebookUtils in AppDelegate.o
  "_OBJC_CLASS_$_Parse", referenced from:
      __TMaCSo5Parse in AppDelegate.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我不知道这意味着什么,但是我尝试了许多其他解决方案,例如清理,删除 Derived Data 文件夹,检查我所有的框架,但我仍然无法解决问题。如果有人知道如何解决这个问题,我将不胜感激。感谢您的宝贵时间。

编辑 这是我正在使用的 Bridging-Header.h:

#import <AFNetworking.h>
#import <BDBOAuth1RequestOperationManager.h>
#import <NSDictionary+BDBOAuth1Manager.h>
#import <UIImageView+AFNetworking.h>
#import <UIScrollView+SVInfiniteScrolling.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
#import <FBSDKShareKit/FBSDKShareKit.h>
#import <Parse/Parse.h>
#import <ParseCrashReporting/ParseCrashReporting.h>
#import <ParseFacebookUtilsV4/PFFacebookUtils.h>
#import <Bolts/Bolts.h>

这是 AppDelegate.swift 文件:

import UIKit
import CoreData
import Parse
import FBSDKCoreKit
import FBSDKLoginKit
import Bolts

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.
    UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

    // Type casting in swift is "as Type", you'll need to unwrap optionals however.
    let tabBarController = self.window!.rootViewController as! UITabBarController
    let tabBar = tabBarController.tabBar as UITabBar

    // I prefer to use 0 based labels since the array is 0 based
    let tabBarItem0 = tabBar.items![0] as! UITabBarItem
    let tabBarItem1 = tabBar.items![1] as! UITabBarItem
    let tabBarItem2 = tabBar.items![2] as! UITabBarItem

    // The UIColor method you are using is an initializer in swift
    tabBar.tintColor = UIColor(red: 62.0/255.0, green: 191.0/255.0, blue: 180.0/255.0, alpha: 1.0)

    // UIImage also has an initializer for your situation in swift
    tabBarItem0.selectedImage = UIImage(named: "Discover TabBar Select.pdf")
    tabBarItem1.selectedImage = UIImage(named: "Me TabBar Select.pdf")
    tabBarItem2.selectedImage = UIImage(named: "Settings TabBar Select.pdf")

    //Facebook SDK Setup
    FBSDKApplicationDelegate.sharedInstance()
    Parse.setApplicationId("HxjVTJZ2rZA6qFBl0Xaji9z12HYQmTFPIXhVcfPp", clientKey:"8FJT7KHSmDPZi1AtpFS1GvTw39qevvB0JuimwWdS")

    if let launchOptions = launchOptions 
        PFFacebookUtils.initializeFacebookWithApplicationLaunchOptions(launchOptions)
     else 
        PFFacebookUtils.initializeFacebookWithApplicationLaunchOptions([NSObject:AnyObject]())
    

    // [Optional] Power your app with Local Datastore. For more info, go to
    // https://parse.com/docs/ios_guide#localdatastore/iOS
    Parse.enableLocalDatastore()

    // [Optional] Track statistics around application opens.
    PFAnalytics.trackAppOpenedWithLaunchOptions(launchOptions)

    return true


func applicationDidBecomeActive(application: UIApplication) 
    // Restart any tasks that were paused (or not yet started) while the      application was inactive. If the application was previously in the background, optionally refresh the user interface.
    FBSDKAppEvents.activateApp()

我将最新的 Parse 和 Facebook SDK 框架拖到我的项目中,并通过“构建阶段”部分下的“将二进制文件与库链接”选项卡添加了所需的附加框架(包括 libsqlite3.dylib 和 libz.dylib)

我希望这些附加信息有用。

【问题讨论】:

您能否向我们提供您正在尝试构建的代码? @MattG 我已经更新了我的问题,感谢您的帮助 @Armin 你解决了这个问题吗? @Lücks 我一直在尝试解决这个问题,并且我认为我取得了一些进展,但它仍然无法正常工作。我通过“链接二进制库”选项卡添加了 Parse 框架,我认为这解决了很多问题,但现在我认为问题出在桥接头上。我删除了旧的桥接头并制作了一个新的,但它说“无法导入桥接头”并且某些框架(特别是与 facebook 相关的框架)出现错误,说明“无法构建模块 'FBSDKCoreKit'” @Armin 我们可以在 Parse 上打开一个错误或在他们的论坛上发布有关此问题的问题。 【参考方案1】:

我也遇到了同样的问题。在我的矿井中,Facebook sdk 4.1。这些是我的步骤:-

1) 转到构建设置

2) 键入其他链接器标志。并且因为我使用的是目标 C。所以我点击了它并添加了两个新值。第一个是 -ObjC,第二个是 $(inherited)。添加这两个值后,您的其他链接器标志将显示为 -ObjC -ObjC -|"Pods-...... 类似于。我正在使用 cocapods。

3) 现在输入“允许框架模块中的非模块化包含”并使用 YES 值。

4) 然后输入“启用模块(C 和 Objective-C),它应该是 YES。

清理并构建您的项目。如果它仍然不适合您,请检查您的链接二进制库。在 My Mine 中,这些是框架。

Accounts.framework
AddressBook.framework
Foundation.framework
CFNetwork.framework
GoolgeMaps.Framework
Social.framework
CoreData.framework
QuartzCore.framework
Security.framework
CoreLocation.framework
CoreGraphics.framework
UIKit.framework

请尝试一下,谢谢

【讨论】:

我尝试按照您的说明操作,但又遇到了 45 个错误 哇!有效。我花了很长时间才找到这个答案。你应该得到 100+ 票 :-)【参考方案2】:

将 Parse 更新到 1.7.4 版后,此问题自行修复。希望这可以帮助其他和我遇到同样问题的人!

【讨论】:

【参考方案3】:

解决我的问题的方法是将 Facebook 框架添加到链接框架和库中。请注意,这未包含在 Facebook 登录文档中。

【讨论】:

以上是关于在 Xcode 6.3 (Swift) 中使用 Parse 和 Facebook 框架编译错误的主要内容,如果未能解决你的问题,请参考以下文章

addAttribute 在 Swift 1.2 (Xcode 6.3) 中失败

AppDelegate.swift 如何在 Xcode 6.3 中替换 AppDelegate.h 和 AppDelegate.m

Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化?

从 Xcode 6.3 上传的存档的 iTunes Connect 错误:包含无效的 Swift 版本

swift 1.2 / xcode 6.3 更新后未调用获取的结果控制器委托

如何在 Xcode 6.3 中安装 Quick and Nimble