Розбір для 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
звучить так, якщо якщо присутній будь-який із цих 2 прапорів -ObjC та -all_load, Facebook SDK повинен бути присутнім / встановленим ... або ви можете видалити ці прапори, якщо вони вам насправді не потрібні, але я думаю, що restKit вони потрібні, отже, вони мені потрібні. parse.com/questions/…
topwik

просто додайте bolt.framework та facebook.framework з прапорцем -objc. він працює для мене.
Шаукет Шейх

ld: фреймворк не знайдено Метал для архітектури armv7 clang: помилка: помилка команди компонувача з кодом виходу 1 (використовуйте -v, щоб побачити виклик)
sanjeev sharma

Відповіді:


137

Це якась помилка, пов’язана з випуском Parse iOS 1.1.33, оскільки декілька людей бачать одні й ті самі помилки - в тому числі і я.

Є кілька обхідних шляхів -

Якщо ви не використовуєте бібліотеку, яка вимагає прапорець -ObjC, ви можете видалити -ObjC зі свого проекту:

Налаштування збірки> Інші прапори зв'язування> видалити -ObjC

або якщо ви використовуєте бібліотеку, яка вимагає цього прапора, ви можете додати Facebook SDK.

Обидва варіанти усунуть помилки. Будемо сподіватися, що вони це виправлять, оскільки мені не потрібно Facebook SDK у моєму додатку.

Слідкуйте за обговоренням тут:

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


Видалення -ObjC не виправило це для мене. Відповідь dbquarrel нижче все ж таки зробив.
шим

2
я видалив прапорець -all_load і це зафіксувало для мене, тому ви можете оновити відповідь, включивши також цей прапор C:
A'sa Dickens

1
В інших прапорах компонувальника у мене раніше було "-all_load", з "встановлення pod" він пропонував встановити "інший прапор компонувальника" на "$ (успадковано)", він працював без жодних проблем.
турбо

Чи можете ви вказати, де знайти і як додати facebook SDK до Xcode 6.2 (iOS 8)? У мене є developers.facebook.com/docs/ios, де після встановлення Facebook.pkg я не можу знайти FacebookSDK.frameworkфайл і містить інші непотрібні файли.
Інспектор

Виникла проблема, якщо видалити перемикач -ObjC. Бібліотека libCordova.a визначає деякі категорії в NSString, які не завантажуватимуться, якщо -ObjC буде видалено. Навколо потрібно видалити libCordova.a зі зв’язаних фреймворків і додати це до налаштування збірки Інших прапорів Linker: -force_load $ (BUILT_PRODUCTS_DIR) /libCordova.a
Nijil Nair

102

Ось потенційно простіший спосіб вирішення проблеми, ніж завантаження, компіляція та встановлення FB-комплекту, який є таким собі великим і громіздким. Зверніть увагу, що, звичайно, ви не зможете використовувати будь-яку функцію типу FB в Parse, і ви зіткнетеся з серйозними проблемами, якщо ви активуєте будь-який з коду 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
Алі Суфян

2
Швидко і просто! Дякую. +1
Девід Да Сільва Контін

1
Дякую @dbquarrel, +1
iBhavik

2
Це чарівне рішення .. якщо ви не хочете інтеграції FB у своєму додатку, перейдіть за цим.
Бхарат,

1
Найпростіше рішення :-)
Muzammil

27

Ви повинні видалити старе ParseFacebookUtils.frameworkі зберегти нове, ParseFacebookUtilsV4.frameworkщоб воно працювало.


3
ГЕ, ВИ ПРОГРАЛЮЄТЕ ЦЮ НИТЬ, ЦЕ ПРАВИЛЬНИЙ ВІДПОВІДЬ! / \
Рафаель Олівейра

Це те, що мені це виправлено! Жоден з коментарів розробників на веб-сайтах Parse чи інші відповіді тут не спрацювали ... +9000, якщо я міг!
WendiKidd

Легко і ідеально. Дякую!
Лапідус

Так ... це все. Чому ця стара бібліотека все ще постачається із 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 самостійно.

Будь ласка, зверніться до цього посилання, використовуючи синтаксичний розбір ios sdk, не включаючи facebook sdk

Ключовим моментом є використання -force_load $(SRCROOT)/path/libname.aдля зв’язку з необхідними сторонніми бібліотеками, а не використання -all_loadта-ObjC


1

Це помилка лінкера ... Ви не включаєте необхідний фреймворк у свій проект, на який ви посилаєтесь, в один із включених файлів заголовків.

Так, наприклад, якщо у вас є включення у ваш код:

#import <Parse/Parse.h>

Ймовірно, для цього потрібна підтримка, і ви повинні включити її у свій додаток. Ви включили parse.frameworkзсередини Xcode?

Xcode Frameworks


1

У мене було те саме використання, і єдиною третьою стороною, яку я мав, був SDK PayPal. Після видалення -ObjC все побудовано нормально. (завжди робіть резервну копію свого проекту перед зміною налаштувань)


1

це 2015 рік, і я просто мав ту саму помилку. На жаль, жодна з наведених відповідей не спрацювала для мене. Але це зробило:

Target> Фази побудови> Пов'язати двійковий файл з бібліотеками, а потім додати libstdc ++. 6.dylib

Це вирішило проблему для мене.


схоже виправляє частину проблем
SKYnine

0

Є багато фреймворків, яким потрібно встановити прапор -ObjC як Інший зв’язаний прапор, тоді як Parse не дозволяє продовжувати, якщо ви це зробите. Щоб впоратися з цим, ви можете зробити одну з наступних речей. Я показав приклад SDK Карт Google, якому потрібен прапор -ObjC, але через Parse в тому ж проекті я не можу використовувати його безпосередньо:

Рішення 1 - Використання прапорця force_load

Замість того, щоб встановлювати прапор -ObjC як Інший зв’язаний прапор, використовуйте прапор force_load для завантаження певного фреймворку або бібліотеки.

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

Рішення 2 - Використання Facebook SDK

Просто додайте Facebook SDK як окремий фреймворк, це дозволить вам використовувати прапор -ObjC. Також переконайтеся, що ви додали Accounts.frameworkта Social.framework. Якщо ви додали Bolt.framework і використовуєте синтаксичний аналіз порожнього проекту, то для вирішення дубліката символу видаліть Bolt.framwork. Якщо все-таки в ньому мало помилок, видаліть Облікові записи та Соціальну структуру та додайте ще раз (Це буде так, якщо ви використовували синтаксичний аналіз порожнього проекту).


-1

Мене це питання турбувало багато днів. Я використовував cocoapods для управління всіма третіми SDK.

Ось як я вирішив це питання. Перейдіть до проекту pod і встановіть для пункту "тільки архітектура побудови" значення НІ.

Відновіть проект pod, а потім помилки посилань зникнуть! Допомогти це може допомогти тому, хто вживає кокоподи.введіть тут опис зображення


-1

У мене була та сама проблема. Я вирішив, завантаживши попередню версію (1.1.32) звідси:

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

(У моєму випадку мені знадобився прапор -ObjC)

Редагувати: Здається, що версія не працює з 64-розрядними архітектурами.


-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 і додайте це у свій підфайл:

pod 'Facebook-iOS-SDK'
pod 'Parse'
pod 'ParseFacebookUtils'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.