Неопределенный сбой компоновщика символов для Estimote SDK

Я пытаюсь включить Estimote SDK 3.0 в свой проект, но получаю следующую ошибку связывания:

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_ESTBeaconRegionWrapper", referenced from:
      objc-class-ref in EstimoteSDK(ESTSecureBeaconManager.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я добавил фреймворк в «фазу сборки» и проверил, что параметр каталога поиска фреймворка содержит каталог.

Я загрузил пример приложения из Estimote, и он использовал ту же структуру (откуда я ее скопировал), и эта сборка прошла нормально. Явных отличий не вижу.

Как я могу понять, что не так?

РЕДАКТИРОВАТЬ: я использую Xcode 6.2. Я строю для iPhone 6 (указаны архитектуры arm64, armv7, armv7s). После вопроса ниже я собираю для armv7s и получаю ту же ошибку (для armv7s). Таким образом, должна быть проблема с связыванием Framework.

РЕДАКТИРОВАТЬ 2: я удалил -ObjC «Другой флаг компоновщика», так как добавление этого в проект Estimote приводит к той же ошибке. Однако теперь я получаю гораздо больше ошибок:

Ld /Users/.../iDomsPortalDev normal arm64
    cd "/Users/.../idoms-portal"
    export IPHONEOS_DEPLOYMENT_TARGET=7.0
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk -L/Users/.../Products/Debug-iphoneos -F/Users/.../Products/Debug-iphoneos -FiDoms/frameworks -F/Applications/Xcode.app/Contents/Developer/Library/Frameworks -filelist /Users/.../Debug-iphoneos/iDoms\ Dev.build/Objects-normal/arm64/iDomsPortalDev.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -dead_strip -lxml2 -lc++ -fobjc-arc -fobjc-link-runtime -miphoneos-version-min=7.0 -framework CrashReporter -framework EstimoteSDK -weak_framework Accelerate -weak_framework Social -weak_framework Twitter -framework MessageUI -framework MapKit -framework AVFoundation -framework SystemConfiguration -framework MediaPlayer -framework QuartzCore -framework UIKit -framework Foundation -framework CoreGraphics -framework CoreData -framework CoreLocation -Xlinker -dependency_info -Xlinker /Users/.../Debug-iphoneos/iDoms\ Dev.build/Objects-normal/arm64/iDomsPortalDev_dependency_info.dat -o /Users/.../iDomsPortalDev

Undefined symbols for architecture arm64:
  "_CBAdvertisementDataServiceDataKey", referenced from:
      +[ESTDeviceDataHelper parseAdvertisingData:] in EstimoteSDK(ESTDeviceDataHelper.o)
  "_OBJC_CLASS_$_CBCentralManager", referenced from:
      objc-class-ref in EstimoteSDK(ESTBeaconDevice.o)
  "_kSecAttrService", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessibleAfterFirstUnlock", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_OBJC_CLASS_$_CBUUID", referenced from:
      objc-class-ref in EstimoteSDK(ESTBeaconDevice.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceAuth.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceEstimote.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceOta.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceSoftware.o)
      objc-class-ref in EstimoteSDK(ETBluetoothMath.o)
  "_kSecAttrAccessibleWhenUnlocked", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecReturnAttributes", referenced from:
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessible", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessibleAlways", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_CBCentralManagerScanOptionAllowDuplicatesKey", referenced from:
      -[ESTBeaconDevice startScanning] in EstimoteSDK(ESTBeaconDevice.o)
  "_SecItemDelete", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessibleAlwaysThisDeviceOnly", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_SecItemUpdate", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessibleWhenUnlockedThisDeviceOnly", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_SecItemAdd", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_SecItemCopyMatching", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecClass", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecClassGenericPassword", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccount", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecValueData", referenced from:
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecAttrAccessGroup", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
      -[ESTKeychain setObject:forKey:] in EstimoteSDK(ESTKeychain.o)
      +[ESTKeychain bundleSeedID] in EstimoteSDK(ESTKeychain.o)
  "_kSecMatchLimitOne", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecMatchLimit", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
  "_kSecReturnData", referenced from:
      -[ESTKeychain dataForKey:] in EstimoteSDK(ESTKeychain.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

[Редактировать 3:] С добавлением Security.framework кажется, что он делает еще один шаг:

Ld /Users/.../Products/Debug-iphoneos/iDomsPortalDev.app/iDomsPortalDev normal arm64
    cd "/Users/.../idoms-portal"
    export IPHONEOS_DEPLOYMENT_TARGET=7.0
    export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk -L/Users/.../Products/Debug-iphoneos -F/Users/.../Library/Frameworks -filelist /Users/.../iDoms.build/Debug-iphoneos/iDoms\ Dev.build/Objects-normal/arm64/iDomsPortalDev.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -dead_strip -lxml2 -fobjc-arc -fobjc-link-runtime -miphoneos-version-min=7.0 -framework Security -framework CrashReporter -framework EstimoteSDK -weak_framework Accelerate -weak_framework Social -weak_framework Twitter -framework MessageUI -framework MapKit -framework AVFoundation -framework SystemConfiguration -framework MediaPlayer -framework QuartzCore -framework UIKit -framework Foundation -framework CoreGraphics -framework CoreData -framework CoreLocation -Xlinker -dependency_info -Xlinker /Users/Luuk/Library/Developer/Xcode/DerivedData/iDoms-gperwbbtttggqpcvozenraexrhrx/Build/Intermediates/iDoms.build/Debug-iphoneos/iDoms\ Dev.build/Objects-normal/arm64/iDomsPortalDev_dependency_info.dat -o /Users/Luuk/Library/Developer/Xcode/DerivedData/iDoms-gperwbbtttggqpcvozenraexrhrx/Build/Products/Debug-iphoneos/iDomsPortalDev.app/iDomsPortalDev

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_CBCentralManager", referenced from:
      objc-class-ref in EstimoteSDK(ESTBeaconDevice.o)
  "_OBJC_CLASS_$_CBUUID", referenced from:
      objc-class-ref in EstimoteSDK(ESTBeaconDevice.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceAuth.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceEstimote.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceOta.o)
      objc-class-ref in EstimoteSDK(ESTBluetoothServiceSoftware.o)
      objc-class-ref in EstimoteSDK(ETBluetoothMath.o)
  "_CBAdvertisementDataServiceDataKey", referenced from:
      +[ESTDeviceDataHelper parseAdvertisingData:] in EstimoteSDK(ESTDeviceDataHelper.o)
  "_CBCentralManagerScanOptionAllowDuplicatesKey", referenced from:
      -[ESTBeaconDevice startScanning] in EstimoteSDK(ESTBeaconDevice.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

person Luuk D. Jansen    schedule 20.03.2015    source источник
comment
Вы проверили, есть ли новая версия библиотеки, которую вы используете? И можете ли вы предоставить некоторую информацию об архитектуре вашего приложения и действительной архитектуре в настройках сборки и версии XCode, которую вы используете? (Похоже, библиотека не поддерживает Arm64.)   -  person ondermerol    schedule 20.03.2015
comment
Я добавил версию Xcode. Он также не собирается для armv7, поэтому проблема должна быть в линковке. Вероятно, что-то маленькое/простое, что я должен сделать или забыл.   -  person Luuk D. Jansen    schedule 20.03.2015
comment
В проекте Estimote Example не установлены флаги компоновщика.   -  person Luuk D. Jansen    schedule 20.03.2015
comment
Привет, это Петр из Estimote — мы действительно считаем это ошибкой и работаем над ее решением, следите за выпуском исправления ошибки.   -  person heypiotr    schedule 26.03.2015
comment
Привет @heypiotr, пожалуйста, посмотрите мое решение внизу, я думаю, что это решило это для меня, мне не нужна безопасность. Просто старые настройки сборки в существующем проекте.   -  person Luuk D. Jansen    schedule 26.03.2015
comment
Хороший! У нас было еще несколько человек, которые сообщили, что изменение этих настроек помогает. Мы только что выпустили версию 3.0.2, которая должна решить эту проблему без каких-либо изменений (:   -  person heypiotr    schedule 26.03.2015


Ответы (4)


Это исправлено в Estimote SDK 3.0.2! (:

https://github.com/Estimote/iOS-SDK/blob/master/CHANGELOG.md#302-march-26-2015

person heypiotr    schedule 26.03.2015

Благодаря различным подсказкам выше я просмотрел весь файл сборки и нашел другой флаг. Это «Включить модули», и в моих настройках сборки было установлено значение «Нет».

person Luuk D. Jansen    schedule 20.03.2015

Я только что скачал https://github.com/Estimote/iOS-SDK их SDK и успешно включил это в типовом проекте.

В разделе "Настройки сборки" в разделе "Только сборка активной архитектуры" установите для параметра Отладка значение ДА.

Также попробуйте на вкладках «Общие»

  • Добавьте фреймворк в разделе «Связать фреймворки и библиотеки».
  • Добавьте фреймворк в разделе «Встроенные двоичные файлы».

Убедитесь, что EstimoteSDK.framework действительно присутствует в исходном месте, возможно, вы случайно удалили его.

person swapnilagarwal    schedule 20.03.2015
comment
В некоторых ошибках OP отсутствует зависимость Security.framework. Как вам удалось интегрировать его без необходимости? Вы действительно использовали какую-либо функциональность фреймворка? - person trojanfoe; 20.03.2015
comment
Я только начал его интегрировать, но уже использую некоторые классы. Security.framework также отсутствует в примере приложения. - person Luuk D. Jansen; 20.03.2015
comment
Я должен быть что-то в моих настройках сборки так. Просто не знаю с чего начать, этому проекту 3 года, так что там могут быть изменения, унаследованные от гораздо более ранних версий iOS. - person Luuk D. Jansen; 20.03.2015
comment
Интересно, когда я добавляю Security.framework, я получаю разные (или меньше?) ошибки, см. выше edit3. Любые другие предложения? - person Luuk D. Jansen; 20.03.2015

Глядя на podspec, он указывает, что флаг -lc++ должен быть добавлен к OTHER_LDFLAGS. Если у вас не установлен этот флаг, возможно, это может вызвать такие проблемы.

person MANIAK_dobrii    schedule 20.03.2015
comment
Кажется, я вижу, в чем проблема. У меня установлен -ObjC. Если я установлю это в проекте Estimote, он тоже не сработает, поэтому он должен быть где-то в этом углу. Я не могу вспомнить, зачем мне нужно было добавить -ObjC. Если я удалю его из моего существующего проекта, я получу гораздо больше ошибок Estimote. Я опубликую полный список ошибок выше. - person Luuk D. Jansen; 20.03.2015