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文件添加到目标中:https://dev59.com/G2435IYBdhLWcg3wohtT#5300901 - Mike D
2
听起来好像如果这两个标志之一 -ObjC 和-all_load 存在,那么Facebook SDK 必须存在/安装...或者如果你不需要它们,你可以删除这些标志,但我认为restKit 需要它们,因此我需要它们。https://parse.com/questions/undefined-symbols-for-my-architecture-updating-parse - topwik
只需使用-objc标志将bolt.framework和facebook.framework添加进去即可。它对我有效。 - Muhammad Shauket
ld: 找不到架构为armv7的Metal框架 clang: 错误:链接器命令失败,退出码为1(使用-v查看调用) - sanjeev sharma
16个回答

137

有些人,包括我自己,遇到了与Parse iOS 1.1.33版本相关的某种错误。

有几种解决方法:

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

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

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

这两个选项都将消除错误。希望他们能修复此问题,因为我的应用程序不需要Facebook SDK。

在此处查看讨论:

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


去掉-ObjC对我没有起作用。但是下面dbquarrel的回复解决了问题。 - shim
2
我移除了-all_load链接器标志,这对我有用,所以您可以更新答案以包括该标志。C: - A'sa Dickens
1
在“其他链接器标志”中,我之前设置了“-all_load”,从“pod install”建议将“其他链接器标志”设置为“$(inherited)”,它可以正常工作,没有任何问题。 - turbo
请问您可以指出在哪里找到并如何将 Facebook SDK 添加到 Xcode 6.2(iOS 8)中吗?我访问了 https://developers.facebook.com/docs/ios,但在安装 Facebook.pkg 后无法找到 FacebookSDK.framework 文件,只有其他不必要的文件。 - Incpetor
如果您删除了-ObjC链接器开关,则会出现问题。 libCordova.a库在NSString上指定了一些类别,如果删除-ObjC,则不会加载这些类别。解决方法是从链接的框架中删除libCordova.a,并将其添加到其他链接器标志构建设置中:-force_load $(BUILT_PRODUCTS_DIR)/libCordova.a - Nijil Nair
我遇到了这个错误 ld: framework not found Metal for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation) - sanjeev sharma

102

这里有一个可能比下载、编译和安装FB kit更简单的解决方法,而且它相对来说也更小巧方便。当然,需要注意的是,在 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 Silva Contín
1
感谢@dbquarrel,+1。 - iBhavik
2
这是一个神奇的解决方案.. 如果你不想在你的应用程序中集成FB,那就选择它吧。 - Bharat
1
最简单的解决方案 :-) - Muzammil
显示剩余2条评论

26

您需要删除旧的ParseFacebookUtils.framework,并保留新的ParseFacebookUtilsV4.framework才能使其正常工作。


3
嘿,正在滚动此帖子的你,这是正确答案!/\。 - Raphael Oliveira
这就是解决我的问题的方法!Parse网站上的所有开发人员评论和其他回答都无效...如果我能评价+9000分! - WendiKidd
易于操作且完美无瑕。谢谢! - 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
在您的应用程序中创建一个名为“FBMissingSymbols”的对象,删除.h文件(因为您不需要它),然后将上述内容放入“FBMissingSymbols.m”中。 - Nate Lee
这个新的.m文件顶部需要包含#import <Foundation/Foundation.h>吗? - AdamT

10

请检查并确保您没有两个版本的"ParseFacebookUtils"框架:

ParseFacebookUtilsV4 和 ParseFacebookUtils

我曾经移除了ParseFacebookUtils,只保留了ParseFacebookUtilsV4,这样做后问题得到了解决。


这正是问题所在。一旦移除,所有9个错误都消失了!谢谢 - Nick89

7

我的解决方案肯定有效,你可以在其他链接标志中使用-ObjC。

  1. 添加"Social.framework","Account.framework"
  2. 添加"FacebookSDK.framework"

干杯....现在它可以工作了.....而且不需要删除-ObjC。


这是非常简单和棒的答案。但是唯一的问题是在我的情况下我没有添加Facebook.framework,但仍然可以成功构建应用程序。无论如何,+1 点赞这个简单的解决方案。 - hp iOS Coder
对我来说,只需要添加“Social.framework”和“Account.framework”。谢谢,现在运行得很好 :) - evya

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

2
一份对 @blueHula 回答的补充:
Parse 已经从其框架中移除了 Facebook SDK,这意味着从某个特定版本(可能是1.1.33)开始,集成 parse.framework 应该同时独立集成 FB SDK。
请参考此链接 using the parse ios sdk without including the facebook sdk 关键点是使用 -force_load $(SRCROOT)/path/libname.a 来链接必要的第三方库,而不是使用 -all_load-ObjC

1
这是一个链接错误...你在项目中引用了一个头文件,但没有包含所需的框架。
例如,如果你的代码中有一个包含语句:
#import <Parse/Parse.h>

这可能需要一个支持框架,并且您需要将其包含在应用程序中。您是否在Xcode中包含了parse.framework

Xcode Frameworks


1

现在是2015年,我遇到了同样的错误。不幸的是,以上的回答都对我没用。但是这个方法有效:

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

这个方法解决了我的问题。


似乎解决了部分问题。 - SKYnine

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