Phân tích cú pháp cho iOS: Lỗi khi cố gắng chạy ứng dụng


80

Tôi đã làm việc với Phân tích cú pháp SDK và tôi đã làm theo hướng dẫn bước nhanh. Khi tôi cố gắng chạy, tôi nhận được 8 lỗi này. Bất kỳ ý tưởng tại sao? Có vẻ như điều gì đó liên quan đến phần Phân tích cú pháp trên Facebook mà tôi không sử dụng.

 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)

Có vẻ như bạn cần thêm các tập tin .m để nhắm mục tiêu: stackoverflow.com/a/5300901/620197
Mike D

2
Nghe có vẻ như nếu một trong hai cờ -ObjC và -all_load có mặt, thì SDK Facebook phải có mặt / được cài đặt ... hoặc bạn có thể xóa các cờ đó nếu bạn không thực sự cần chúng, nhưng tôi nghĩ restKit cần chúng, do đó tôi cần chúng. parse.com/questions/…
topwik

chỉ cần thêm bolt.framework và facebook.framework với -objc flag.its phù hợp với tôi.
Shauket Sheikh

ld: khuôn khổ không tìm thấy kim loại cho kiến trúc ARMv7 kêu vang: lỗi: lệnh mối liên kết thất bại với mã exit 1 (-v sử dụng để xem invocation)
Sanjeev sharma

Câu trả lời:


137

Đây là một số loại lỗi liên quan đến bản phát hành Phân tích cú pháp iOS 1.1.33 vì nhiều người đang gặp các lỗi giống nhau, bao gồm cả bản thân tôi.

Có một số cách giải quyết-

Nếu bạn không sử dụng thư viện yêu cầu cờ trình liên kết -ObjC, bạn có thể xóa -ObjC khỏi dự án của mình:

Cài đặt bản dựng> Cờ trình liên kết khác> xóa -ObjC

hoặc nếu bạn đang sử dụng thư viện yêu cầu cờ đó, bạn có thể thêm SDK Facebook.

Cả hai tùy chọn sẽ loại bỏ các lỗi. Hy vọng rằng họ sẽ sửa lỗi này vì tôi không cần SDK Facebook trong ứng dụng của mình.

Theo dõi cuộc thảo luận tại đây:

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


Việc xóa -ObjC không khắc phục được sự cố cho tôi. Câu trả lời của dbquarrel bên dưới đã làm được.
shim

2
tôi loại bỏ các lá cờ -all_load mối liên kết và cố định nó cho tôi, vì vậy bạn có thể cập nhật câu trả lời cho cũng bao gồm rằng cờ C:
A'sa Dickens

1
Trong cờ trình liên kết khác, tôi đã có '-all_load' trước đây, từ 'cài đặt pod', nó đề xuất đặt 'cờ trình liên kết khác' thành '$ (kế thừa)', nó hoạt động mà không gặp bất kỳ vấn đề gì.
turbo

Bạn có thể vui lòng chỉ nơi để tìm và cách thêm SDK facebook vào Xcode 6.2 (iOS 8) không? Tôi có Develop.facebook.com/docs/ios trong đó sau khi cài đặt Facebook.pkg, tôi không thể tìm thấy FacebookSDK.frameworktệp và có các tệp không cần thiết khác.
Incpetor

Đã xảy ra sự cố nếu bạn xóa công tắc trình liên kết -ObjC. Thư viện libCordova.a chỉ định một số danh mục trên NSString sẽ không được tải nếu -ObjC bị xóa. Một tác phẩm xung quanh là để loại bỏ libCordova.a từ các khuôn khổ liên kết và thêm video này vào các khác Flags Linker xây dựng thiết lập: -force_load $ (BUILT_PRODUCTS_DIR) /libCordova.a
Nijil Nair

102

Đây là một cách giải quyết đơn giản hơn có thể là tải xuống, biên dịch và cài đặt bộ FB vốn khá lớn và cồng kềnh. Lưu ý rằng tất nhiên, bạn sẽ không thể sử dụng bất kỳ chức năng loại FB nào trong Phân tích cú pháp và bạn sẽ gặp phải các vấn đề nghiêm trọng nếu bạn kích hoạt bất kỳ mã Phân tích cú pháp nào đang mong đợi sử dụng các ký hiệu giả này. Nhưng, nếu bạn tránh xa chúng, tôi nghĩ bạn sẽ không sao. Vì thế...

  1. Tạo một đối tượng trong ứng dụng của bạn có tên FBMissingSymbols

  2. Xóa .h bạn sẽ không cần nó

  3. Đặt cái này trong .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
Đã giải quyết vấn đề của tôi. Cảm ơn và +1
Ali Sufyan

2
Nhanh chóng và đơn giản! Cảm ơn. +1
David Da Silva Contín

1
Cảm ơn @dbquarrel, +1
iBhavik

2
Đây là giải pháp kỳ diệu .. nếu bạn không muốn tích hợp FB trong ứng dụng của mình thì hãy làm.
Bharat

1
Giải pháp đơn giản nhất :-)
Muzammil

27

Bạn phải xóa cái cũ ParseFacebookUtils.frameworkvà giữ cái mới ParseFacebookUtilsV4.frameworkđể nó hoạt động.


3
ÔNG BẠN GHI RÕ RỒI THÌ ĐÂY LÀ CÂU TRẢ LỜI ĐÚNG! / \
Raphael Oliveira

Đây là những gì đã sửa nó cho tôi! Không có nhận xét nào của nhà phát triển trên trang web của Parse hoặc các câu trả lời khác ở đây có hiệu quả ... +9000 nếu tôi có thể!
WendiKidd

Dễ dàng và hoàn hảo. Cảm ơn!
Lapidus

Đúng… đây là nó. Tại sao thư viện cũ nát này vẫn được vận chuyển cùng với Parse SDK ?? Điều này không nên phức tạp như vậy.
thefaj

23

Tôi thích câu trả lời của dbquarrel, nhưng nó không hoạt động nữa vì nó thiếu một số tầng lớp xã hội mới.

Vì vậy, hãy làm điều tương tự, nhưng thay vào đó, hãy thêm điều này:

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
Cảm ơn đã cập nhật điều này!
sridvijay

Tạo một đối tượng trong ứng dụng của bạn có tên FBMissingSymbols, Xóa .h (vì bạn không cần nó), sau đó đặt ở trên vàoFBMissingSymbols.m
Nate Lee

Không .mcần #import <Foundation/Foundation.h>bao gồm tệp mới này ở trên cùng?
AdamT

10

Kiểm tra và đảm bảo rằng bạn không có hai phiên bản của khung "ParseFacebookUtils" được thêm vào đó là:

ParseFacebookUtilsV4 và ParseFacebookUtils

Sau khi tôi xóa ParseFacebookUtils và giữ ParseFacebookUtilsV4, nó hoạt động tốt.


Đây chính xác là vấn đề. Sau khi loại bỏ, tất cả 9 lỗi đều biến mất! Cảm ơn
Nick89.

7

Giải pháp của tôi chắc chắn sẽ hoạt động và bạn có thể sử dụng -ObjC trong các cờ trình liên kết khác.

  1. Thêm "Social.framework", "Account.framework"
  2. Thêm "FacebookSDK.framework"

Chúc mừng .... bây giờ nó hoạt động ..... và không cần phải gỡ bỏ -ObjC.


Đây thực sự là câu trả lời đơn giản và tuyệt vời. Nhưng chỉ có điều là trong trường hợp của tôi, tôi đã không thêm Facebook.framework và nó vẫn xây dựng ứng dụng mà không gặp lỗi. Nhưng dù sao, +1 cho giải pháp đơn giản.
hp iOS Coder

Đối với tôi, nó chỉ là thêm "Social.framework", "Account.framework". Cảm ơn, hoạt động như một nét duyên dáng :)
evya

3

Có vẻ như bạn có thể cần thêm 'Accounts.Framework' và / hoặc 'Social.Framework'.


2

Phần bổ sung cho câu trả lời của @blueHula. Parse đã loại bỏ Facebook SDK khỏi khuôn khổ của nó, có nghĩa là từ một số phiên bản nhất định (có thể là 1.1.33) tích hợp parse.framework nên được tích hợp FB SDK một cách độc lập.

Vui lòng tham khảo liên kết này bằng cách sử dụng sdk phân tích cú pháp ios mà không bao gồm sdk facebook

Điểm mấu chốt là sử dụng -force_load $(SRCROOT)/path/libname.ađể liên kết với các thư viện bên thứ ba cần thiết, thay vì sử dụng -all_load-ObjC


1

Đó là lỗi trình liên kết ... Bạn không đưa vào dự án của mình một khuôn khổ cần thiết mà bạn đang tham chiếu trong một trong các tệp tiêu đề của bạn.

Vì vậy, ví dụ: nếu bạn có bao gồm trong mã của mình:

#import <Parse/Parse.h>

Nó có thể yêu cầu một khung hỗ trợ và bạn phải đưa nó vào ứng dụng của mình. Bạn đã bao gồm parse.frameworktừ bên trong Xcode?

Khung Xcode


1

Tôi đã có cách sử dụng tương tự và bên thứ ba duy nhất tôi có là PayPal SDK. Sau khi loại bỏ -ObjC, mọi thứ đều tốt. (luôn tạo bản sao lưu dự án của bạn trước khi thay đổi cài đặt)


1

đó là năm 2015 và tôi chỉ gặp lỗi tương tự. Thật không may, không có câu trả lời nào ở trên phù hợp với tôi. Nhưng điều này đã làm:

Target> Build Phases> Link Binary With Libraries, sau đó thêm libstdc ++. 6.dylib

Điều này giải quyết các vấn đề đối với tôi.


dường như đã khắc phục được một phần sự cố
SKYnine

0

Có nhiều khung công tác cần đặt cờ -ObjC làm Cờ liên kết khác, trong khi Phân tích cú pháp không cho phép bạn tiếp tục nếu bạn làm như vậy. Để đối phó với điều này, bạn có thể làm một trong những điều sau. Tôi đã trình bày ví dụ về SDK Google Maps cần gắn cờ -ObjC, nhưng do Phân tích cú pháp trong cùng một dự án nên tôi không thể sử dụng trực tiếp:

Giải pháp 1 - Sử dụng cờ force_load

Thay vì đặt cờ -ObjC làm cờ được liên kết khác, hãy sử dụng cờ force_load để tải khung hoặc thư viện cụ thể.

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

Giải pháp 2 - Sử dụng Facebook SDK

Chỉ cần Thêm Facebook SDK làm khung riêng, điều này sẽ cho phép bạn sử dụng cờ -ObjC. Đồng thời đảm bảo rằng bạn đã thêm Accounts.frameworkSocial.framework. Nếu bạn đã thêm Bolt.framework và sử dụng Phân tích cú pháp dự án trống thì để đối phó với biểu tượng trùng lặp, hãy xóa Bolt.framwork. Nếu nó vẫn còn một vài lỗi thì hãy xóa khung Tài khoản và Xã hội và Thêm lại (Điều này sẽ xảy ra nếu bạn đã sử dụng Phân tích cú pháp dự án trống mặc định).


-1

Tôi đã làm phiền vấn đề này trong nhiều ngày. Tôi đã sử dụng cocoapods để quản lý tất cả SDK thứ ba.

Đây là cách tôi giải quyết vấn đề này. Đi tới dự án pod và đặt mục "chỉ xây dựng kiến ​​trúc" thành KHÔNG.

Xây dựng lại dự án pod và sau đó lỗi liên kết đã biến mất! giúp đỡ, điều này có thể giúp những người đang sử dụng cocoapods.nhập mô tả hình ảnh ở đây


-1

Tôi đã từng gặp vấn đề tương tự. Tôi đã giải quyết bằng cách tải xuống phiên bản trước (1.1.32) từ đây:

https://parse.com/downloads/ios/parse-library/1.1.32

(Trong trường hợp của tôi, tôi cần cờ -ObjC)

Chỉnh sửa: Có vẻ như phiên bản đó không hoạt động với kiến ​​trúc 64 bit.


-1

Điều này có thể được xóa khỏi tệp dự án nằm trong <projectname>/cordova/<projectname>/platforms/ios/<projectname>.xcodeproj/project.pbxproj

Tìm kiếm tệp -ObjC, có nhiều vị trí. Nó trông như thế này:

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

Cài đặt cacaoPods và thêm cái này vào Podfile của bạn:

pod 'Facebook-iOS-SDK'
pod 'Parse'
pod 'ParseFacebookUtils'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.