解析iOS:尝试运行该应用时出错


80

我一直在使用Parse SDK,并且遵循了快速步骤指南。当我尝试运行时,出现了这8个错误。有什么想法吗?似乎与我未使用的Parse的Facebook部分有关。

 Undefined symbols for architecture armv7:
"_FBTokenInformationTokenKey", referenced from:
  -[PFFacebookTokenCachingStrategy accessToken] in Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy setAccessToken:] in Parse(PFFacebookTokenCachingStrategy.o)
 "_FBTokenInformationExpirationDateKey", referenced from:
  -[PFFacebookTokenCachingStrategy cacheTokenInformation:] in     Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy expirationDate] in Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy setExpirationDate:] in Parse(PFFacebookTokenCachingStrategy.o)
 "_OBJC_METACLASS_$_FBSessionTokenCachingStrategy", referenced from:
  _OBJC_METACLASS_$_PFFacebookTokenCachingStrategy in Parse(PFFacebookTokenCachingStrategy.o)
"_OBJC_CLASS_$_FBSessionTokenCachingStrategy", referenced from:
  _OBJC_CLASS_$_PFFacebookTokenCachingStrategy in Parse(PFFacebookTokenCachingStrategy.o)
"_FBTokenInformationUserFBIDKey", referenced from:
  -[PFFacebookTokenCachingStrategy facebookId] in Parse(PFFacebookTokenCachingStrategy.o)
  -[PFFacebookTokenCachingStrategy setFacebookId:] in Parse(PFFacebookTokenCachingStrategy.o)
"_OBJC_CLASS_$_FBRequest", referenced from:
  objc-class-ref in Parse(PFFacebookAuthenticationProvider.o)
"_OBJC_CLASS_$_FBSession", referenced from:
  objc-class-ref in Parse(PFFacebookAuthenticationProvider.o)
 ld: symbol(s) not found for architecture armv7
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

看来您需要将.m文件添加到目标:stackoverflow.com/a/5300901/620197
Mike D

2
听起来好像如果存在这两个标志-ObjC和-all_load中的任何一个,则必须存在/安装Facebook SDK ...或者如果您确实不需要它们,则可以删除这些标志,但是我认为restKit需要它们,因此,我需要它们。parse.com/questions/...
topwik

只需添加带有-objc flag.its的bolt.framework和facebook.framework对我有用。
Shauket Sheikh

ld:找不到用于架构armv7的Metal金属clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
sanjeev sharma 2015年

Answers:


137

这是与Parse iOS 1.1.33版本相关的某种错误,因为多个人看到的是相同的错误-包括我自己。

有几种解决方法-

如果不使用需要-ObjC链接器标志的库,则可以从项目中删除-ObjC:

构建设置>其他链接器标志> remove -ObjC

或者,如果您使用的库需要该标志,则可以添加Facebook SDK。

两种选择都将消除错误。希望他们能够解决此问题,因为我的应用程序中不需要Facebook SDK。

请在此处关注讨论:

https://parse.com/questions/cocoapods-incompatibility


删除-ObjC并不能解决我的问题。dbquarrel的响应如下。
shim 2014年

2
我删除了-all_load链接器标志并为我修复了该标志,因此您可以更新答案以包括该标志C:
A'sa Dickens 2014年

1
在其他链接器标记中,我之前使用过“ -all_load”,从“ pod install”中建议将“其他链接器标记”设置为“ $(继承)”,它可以正常工作。
涡轮增压2014年

您能否指出在哪里找到以及如何将Facebook SDK添加到Xcode 6.2(iOS 8)?我有developers.facebook.com/docs/ios,在安装Facebook.pkg之后,我找不到FacebookSDK.framework文件,并且有其他不必要的文件。
Inpettor

如果删除-ObjC链接器开关,则会出现问题。libCordova.a库在NSString上指定了一些类别,如果删除了-ObjC,这些类别将不会加载。解决方法是从链接的框架中删除libCordova.a并将其添加到“其他链接器标志”构建设置中:-force_load $(BUILT_PRODUCTS_DIR)/libCordova.a
Nijil Nair

102

与下载,编译和安装FB工具包相比,这是一种潜在的更简单的解决方法,该工具包既庞大又麻烦。请注意,当然,您将无法使用Parse中的任何FB类型功能,并且如果触发任何希望使用这些虚拟符号的Parse代码,则会遇到严重问题。但是,我想,如果您远离他们,您会没事的。所以...

  1. 在您的应用程序中创建一个名为FBMissingSymbols的对象

  2. 删除不需要的.h

  3. 把它放在.m中:

NSString *FBTokenInformationExpirationDateKey = @"";
NSString *FBTokenInformationTokenKey = @"";
NSString *FBTokenInformationUserFBIDKey = @"";
@interface FBAppCall:NSObject
@end
@implementation FBAppCall
@end
@interface FBRequest:NSObject
@end
@implementation FBRequest
@end
@interface FBSession:NSObject
@end
@implementation FBSession
@end
@interface FBSessionTokenCaching:NSObject
@end
@implementation FBSessionTokenCaching
@end
@interface FBSessionTokenCachingStrategy:NSObject
@end
@implementation FBSessionTokenCachingStrategy
@end

6
解决了我的问题。谢谢,+ 1
Ali Sufyan

2
快速简单!谢谢。+1
David Da SilvaContín2014年

1
感谢@ dbquarrel,+ 1
iBhavik 2014年

2
如果您不希望在应用程序中进行FB集成,那么这是一种神奇的解决方案。
巴拉特2014年

1
最简单的解决方案:-)
Muzammil 2014年

27

您必须删除旧的ParseFacebookUtils.framework并保留新的ParseFacebookUtilsV4.framework才能正常工作。


3
嘿,您对此很满意,这是正确的答案!/ \
Raphael Oliveira 2015年

这就是为我解决的问题!解析网站上的开发者评论或此处的其他答案均无效...如果可以的话,+ 9000!
WendiKidd 2015年

简单而完美。谢谢!
Lapidus

是的...就是这样。为什么仍然使用Parse SDK附带这个旧的库?这应该没有那么复杂。
thefaj

23

我喜欢dbquarrel的答案,但由于它缺少一些新的社会阶层,因此不再起作用。

所以做同样的事情,但是添加以下内容:

NSString *FBTokenInformationExpirationDateKey = @"";
NSString *FBTokenInformationTokenKey = @"";
NSString *FBTokenInformationUserFBIDKey = @"";
NSString *SLServiceTypeTwitter = @"";
NSString *ACAccountTypeIdentifierTwitter = @"";
@interface FBAppCall:NSObject
@end
@implementation FBAppCall
@end
@interface FBRequest:NSObject
@end
@implementation FBRequest
@end
@interface FBSession:NSObject
@end
@implementation FBSession
@end
@interface FBSessionTokenCaching:NSObject
@end
@implementation FBSessionTokenCaching
@end
@interface FBSessionTokenCachingStrategy:NSObject
@end
@implementation FBSessionTokenCachingStrategy
@end
@interface ACAccountStore:NSObject
@end
@implementation ACAccountStore
@end
@interface SLRequest:NSObject
@end
@implementation SLRequest
@end
@interface SLComposeViewController:NSObject
@end
@implementation SLComposeViewController
@end

3
感谢您对此进行更新!
sridvijay 2014年

在您的应用程序中创建一个名为的对象FBMissingSymbols,删除.h(因为您不需要它),然后将其放在FBMissingSymbols.m
Nate Lee

这个新.m文件不需要#import <Foundation/Foundation.h>放在顶部吗?
AdamT

10

检查并确保没有添加两个版本的“ ParseFacebookUtils”框架:

ParseFacebookUtilsV4和ParseFacebookUtils

一旦我删除了ParseFacebookUtils,并保留了ParseFacebookUtilsV4,它就可以正常工作。


这正是问题所在。一旦删除,所有9个错误就消失了!谢谢
Nick89 '16

7

我的解决方案肯定会起作用,您可以在其他链接器标志中使用-ObjC。

  1. 添加“ Social.framework”,“ Account.framework”
  2. 添加“ FacebookSDK.framework”

干杯...。现在它可以工作了...,无需删除-ObjC。


这真的很简单,而且答案很好。但是,就我而言,唯一的事情是我没有添加Facebook.framework,但仍然可以毫无错误地构建应用程序。但是无论如何,+ 1是简单的解决方案。
hp iOS Coder 2015年

对我而言,它只是添加了“ Social.framework”,“ Account.framework”。谢谢,像个魅力一样的作品:)
evya 2015年

3

听起来您可能需要添加“ Accounts.Framework”和/或“ Social.Framework”。


2

@blueHula的答案的补充。Parse已从其框架中删除了Facebook SDK,这意味着从某个特定版本(可能是1.1.33)开始,集成parse.framework时应独立集成FB SDK。

使用解析ios sdk引用此链接,但不包括facebook sdk

关键是使用-force_load $(SRCROOT)/path/libname.a链接必要的第三方库,而不是使用-all_load-ObjC


1

这是一个链接器错误...您没有在项目中包括所需的框架,而在其中包含的头文件中引用了该框架。

因此,例如,如果您的代码中包含一个:

#import <Parse/Parse.h>

它可能需要一个支持框架,您必须将其包含在您的应用程序中。您是否parse.framework在Xcode中包含了from?

Xcode框架



1

那是2015年,而我有同样的错误。不幸的是,以上答案都对我没有帮助。但是这样做:

目标>构建阶段>使用库链接二进制文件, 然后添加libstdc ++。6.dylib

这为我解决了问题。


似乎解决了部分问题
SKYnine 2015年

0

有许多框架需要将-ObjC标志设置为“其他链接的标志”,而如果这样做,则Parse不允许您继续进行。要解决此问题,您可以执行以下操作之一。我已经显示了需要-ObjC标志的Google Maps SDK示例,但是由于在同一项目中进行了解析,因此无法直接使用它:

解决方案1-使用force_load标志

代替将-ObjC标志设置为“其他链接的标志”,可以使用force_load标志加载特定的框架或库。

-force_load $(SRCROOT)/GoogleMaps.framework/Versions/A/GoogleMaps

解决方案2-使用Facebook SDK

只需将Facebook SDK添加为一个单独的框架,这将允许您使用-ObjC标志。还要确保您已添加Accounts.frameworkSocial.framework。如果添加了Bolt.framework并使用Parse空白项目,则删除重复的符号Bolt.framwork。如果仍然有少量错误,请删除“帐户和社交”框架,然后再次添加(如果您使用了Parse默认空白项目,情况就是如此)。


-1

这个问题困扰了我很多天。我使用cocoapods管理所有第三个SDK。

这是我解决此问题的方法。转到pod项目并将“仅构建体系结构”项设置为NO。

重建pod项目,然后链接错误消失了!帮助这可以帮助使用cocoapods的人。在此处输入图片说明



-1

这可以从位于项目文件中删除 <projectname>/cordova/<projectname>/platforms/ios/<projectname>.xcodeproj/project.pbxproj,并

在文件中搜索-ObjC,有多个位置。看起来像这样:

OTHER_LDFLAGS = (
    "-weak_framework",
    CoreFoundation,
    "-weak_framework",
    UIKit,
    "-weak_framework",
    AVFoundation,
    "-weak_framework",
    CoreMedia,
    "-weak-lSystem",
    "-force_load",
    "\"$(BUILT_PRODUCTS_DIR)/libCordova.a\"",
    "-ObjC",
);

-1

安装cocoaPods并将其添加到您的Podfile中:

pod 'Facebook-iOS-SDK'
pod 'Parse'
pod 'ParseFacebookUtils'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.