Не визначені символи для архітектури armv7


307

Ця проблема зводила мене з розуму, і я не можу розробити, як її виправити ...

    Undefined symbols for architecture armv7:
  "_deflateEnd", referenced from:
      -[ASIDataCompressor closeStream] in ASIDataCompressor.o
  "_OBJC_CLASS_$_ASIDataDecompressor", referenced from:
      objc-class-ref in ASIHTTPRequest.o
  "_deflate", referenced from:
      -[ASIDataCompressor compressBytes:length:error:shouldFinish:] in ASIDataCompressor.o
  "_deflateInit2_", referenced from:
      -[ASIDataCompressor setupStream] in ASIDataCompressor.o
ld: symbol(s) not found for architecture armv7
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1

Я думаю, що це стосується:

ld: symbol(s) not found for architecture armv7

Але я додав: libz.1.2.3.dylibі це не допомагає, хтось мав якісь ідеї?


Ще одна можливість, яка не міститься в жодній із існуючих відповідей, полягає в тому, що ви можете використовувати -ObjCпрапор іншого лінкера, і тому Obj-C із зовнішніх статичних бібліотек, які ви використовуєте, не повинні бути видимими (наприклад, з Parse's). Дивіться мою відповідь , якщо це так: stackoverflow.com/a/26151208/901641
ArtOfWarfare

2
Як правило, XCode коли-небудь видає такі помилки, як Match-O та символ, не знайдений для архітектури i386 (або інших), коли файли не були додані до проекту. Можна правою кнопкою миші натиснути папку проекту і зробити "Додати файл до <проекту>".
Fabricio PH

Насправді ви можете бачити конкретні символи, створені за допомогою інструменту nm. Термінал до шляху файлів nm -g. nm -g file.o Ви можете перевірити символи C ++, розібрані з цим: nm -gC file.o
james_alvarez

Може хтось тут, будь ласка, допоможе мені? Я отримую помилку нижче, але жодне з вищезгаданих рішень не працює для мене. Я вже провів дні з усіма можливими налаштуваннями. Undefined symbols for architecture armv7: "YGConfig::YGConfig(int (*)(YGConfig*, YGNode*, YGLogLevel, char const*, void*))", referenced from: _YGConfigNew in libyoga.a(Yoga.o) ld: symbol(s) not found for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
червоний диявол

Відповіді:


506

Загальні причини

Загальні причини для "Не визначених символів для архітектури armv7":

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

    • Додайте правильні бібліотеки в Link Binary With Librariesрозділ Build Phases.

    • Якщо ви хочете додати бібліотеку за межами шляху пошуку за замовчуванням, ви можете включити шлях у Library Search Pathsзначення у налаштуваннях збірки та додати
      -l{library_name_without_lib_and_suffix}(наприклад, для використання libz.a -lz) до Other Linker Flagsрозділу Build Settings.

  2. Ви копіюєте файли у свій проект, але забули перевірити ціль, до якої потрібно додати файли . Щоб вирішити:

    • Відкрийте потрібну Build Phasesціль, розгорніть Compile Sourcesта додайте .mфайли, які відсутні . Якщо це ваше питання, будь ласка, надайте відповідь Cortex нижче .

  3. Ви включаєте статичну бібліотеку, побудовану для іншої архітектури, як i386, симулятор на вашій хост-машині. Щоб вирішити:

    • Якщо у постачальника бібліотек у вас є декілька файлів бібліотек, щоб включити їх у проект, вам потрібно включити файл для тренажера (i386) та той, що використовується для пристрою (наприклад, armv7).

    • За бажанням ви можете створити жирну статичну бібліотеку, яка містить обидві архітектури.



Оригінальний відповідь:

Ви не пов’язані з правильним файлом libz. Якщо ви клацніть правою кнопкою миші на файл і виявіть у пошуку, його шлях повинен бути десь у папці sdk iOS. Ось моя наприклад

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib

Я рекомендую видалити посилання, а потім повторно додати його в розділі Посилання Бінарне з бібліотеками Фази збірки вашої цілі.


4
Це може бути також тому, що вам потрібно додати слово "-licicore" у налаштуваннях проекту / Інші прапорці Linker. Він був доданий автоматично для моєї налагодження, але не випуску, тому не збирався.
JulianB

4
У мене було те саме питання. Насправді не читав належним чином примітки, тому не помітив, що новій версії bugsense потрібен бінарний файл libz, який додається у фазах збірки.
Макс Маклеод

2
Ви впевнені, що включили у відповідний .m файл розділ @implementation для всіх класів, які ви оголосили у файлі заголовка?
slcott

7
Я просто хочу додати, я думаю, що вам було дуже поважно посилатися на іншу відповідь на це питання і сказати нам, щоб ми проголосували, якщо це допомогло.
Андрій

Дякуємо за допомогу! :) Для мене допомогли друкуючи явно Інші прапори компоновщика розділі: -framework <FrameWorkName>. У мене були проблеми з XCTest, тому мені довелося додати -framework XCTest. Дякую! :)
piotr_ch

198

У мене була схожа проблема вчора ввечері, і проблема була пов'язана з тим, що я перетягнув клас із Finder до мого проекту в Xcode.

Рішення полягало в тому, щоб перейти на вкладку «Фази збірки», а потім «Компілювати джерела» та переконатися, що ви перетягуєте клас до списку.


6
Мені хотілося б, щоб я зрозумів, що це відповідь, яку я шукав раніше. Як варіант, ви можете переконатися, що при копіюванні класів клацніть "Додати до цілей".
Т. Маркл

1
Ого, так раді виправити це було просто! Щоб було зрозуміло, якщо ви додаєте клас, перетягнувши з пошуку в проект, XCode не завжди додає їх до списку фаз збірки. Я просто натиснув кнопку "+" у "Compile Sources" під етапами збирання, додав усі файли, що порушують, і він скомпілювався відразу.
Амос

1
Ого. Apple дійсно потребує перегляду своїх повідомлень про помилки.
devios1

2
Ще один спосіб виправити це - вибрати файл, який, як кажуть, відсутній. і відкрийте панель висувних панелей "Утиліти". (Це крайній правий) І виберіть "Інспектор файлів". Потім переконайтеся, що в проекті "Цільове членство" є чек. Я використовую Xcode 4.6.2
zingle-dingle

1
Я не знав, який файл відсутній, тому я показав Фази збірки в помічнику редактора (другий вид редагування). Я відкрив ображений файл у вікні редагування зліва та перевірив, чи існує кожен із імпортованих файлів у фазах збірки. Я додав той, який цього не зробив, і це було вирішено.
Dan Sandland

38

У мене була подібна проблема, і мені довелося перевірити "Тільки активну архітектуру" для кожної з конфігурацій проекту (налагодження, випуск та розгортання) та в "Налаштуваннях збирання" цілі.


3
Також зробив для мене трюк. Це було просто потрібно в головному проекті.
Кіруалекс

4
Я стикаюся з тими ж проблемами. Ці Build Active Architecture Onlyнастройки відрізняються між Podsі мій проект. На етапі зв'язку це не вдалося.
AechoLiu

21

Іншою можливою причиною помилок лінкера "невизначений символ" є спроба викликати функцію C з файлу .mm. У цьому випадку вам потрібно буде використовувати екстерн "C" {...} при імпорті файлів заголовка.

Помилка лінкера при виклику C-функції від Objective-C ++


14

У мене було подібне питання з цим. Назва класу після _OBJC_CLASS _ $ _ була насправді моїм класом. Причиною цього було те, що я не поставив галочку "Додати в ціль", коли перетягнув файли вихідного коду у список навігації.

Моє рішення було:

  1. видаліть клас зі списку навігації та виберіть "видалити лише посилання"

  2. перетягніть файли вихідного коду ще раз і переконайтесь, що прапорець "Додати в ціль" поставлений. Поставте прапорець під пунктами "Скопіювати, якщо потрібно" та "Створити групу".


Просто додам: хоча це НЕ НАЙЧАЛЬНА ПРИЧИНА помилки, я просто зараз відповідь (не поставив галочку).
Адам

8

Зазвичай існує псевдонім без ідентифікатора версії, який пов'язаний з поточною версією, в цьому випадку libz.dylib пов'язаний з libz.1.2.5.dylib. Використовуйте базовий псевдонім замість версії.


5

У розділі Ціль -> Налаштування збірки -> Мова компілятора Apple LLVM: встановлення "Діалект мови мови C ++" та "Стандартна бібліотека C ++" на замовчуванні компілятора допомогло вирішити цю проблему.


5

Я лише додав libz.1.2.5.dylib до свого проекту, і він працював як шарм.

Кроки -

  1. Перейдіть до етапів побудови.
  2. Пов’язати Бінарне з бібліотекою - за допомогою кнопки "+" виберіть рамки та бібліотеки, які потрібно додати.
  3. Виберіть зі списку libz.1.2.5.dylib.
  4. Побудувати та запустити.

5

У мене була подібна проблема, і я побачив помилки, пов'язані з "std ::"

Я змінив налаштування збірки -> Apple LVM 5.0 - мова C ++ -> стандартна бібліотека C ++

від libc ++ (стандартна бібліотека LLVM C ++ із підтримкою C ++ 11) до libstdc ++ (стандартна бібліотека GNU C ++)


5

У мене була така ж проблема, коли я використовую бібліотеку admob, і вирішив змінити "Архітектури" на "Стандартні архітектури armv7, armv7s", не включаючи 64-розрядні. Налаштування побудови


4

У мене є декілька @interface у .h файлі та ще не включив усі відповідні @implementation директиви. Переконайтесь, що вони врівноважені.


4

Якщо у вас є прапор -ObjCпід ціллю> Налаштування збірки> Інші прапорці Linker, і ви отримуєте цю проблему, спробуйте її видалити. Якщо ви навмисно додали його, тому що вам потрібно завантажити деякий код Obj-C зі статичної бібліотеки, яка зазвичай не завантажується в іншому випадку, IE, категорія Obj-C, тоді вам слід використовувати -force_load <path>замість -ObjC.

<path>має бути відносно вашого каталогу проектів Xcode. IE, якщо структура вашого каталогу виглядає так:

iOSProject
  + iOSAPI.framework
      + iOSAPI
  + iOSAPI.xcodeproj

Тоді ви повинні встановити цей прапор для Other Linker Flags:

-force_load iOSAPI.framework/iOSAPI

Якщо ви хочете включити кілька подібних бібліотек, то вам слід включити окремий -force_loadрядок для кожної з них.

-force_load iOSAPI.framework/iOSAPI
-force_load another.framework/another

4

Ось як я отримав цю проблему:

Я додав .h, .m та NIB з іншого проекту, перетягнувши їх у свій навігатор проектів. Xcode не додав їх належним чином до фаз збірки.

Перевірте свою відповідь, оскільки у мене була подібна проблема, яку я зміг вирішити, зробивши кілька кроків.


3

якщо ви маєте справу з оновленням iOS5, я виявив, що для компіляції проекту, написаного на цільовий 4.3, я міг просто перейменувати libz.1.2.3.dynlib у «Навігаторі проектів» на «libz.1.2.5.dynlib», і він скомпілювався.

У моїй папці iPhoneOS50SDK / usr / lib немає libz.1.2.3.dynlib - не знаю, чи це бета-річ чи просто природне оновлення.


3

Перейдіть до свого проекту, натисніть на Фази збірки, Компілюйте джерела, Додайте GameCenterManager.m у список.


3

Можливо, деякі заняття відсутні у вашої цілі. Зазвичай це відбувається під час перейменування / видалення / додавання файлів нових класів до проекту. Для виправлення додайте щойно додані класи до деяких цілей.

Виберіть клас у «Навігаторі проектів» (права бічна панель), відкрийте бічну панель «Утиліти» (права бічна панель), утиліти виберіть «Інспектор файлів» (файл як значок), на вкладці «Цілеве членство» позначте цілі. Це все, щоб уникнути "Видалити посилання" та додати ще раз, позначивши трюк "Додати до цілей".

Отже: Виберіть Клас -> Утиліти (Інспектор файлів) -> Цільове членство -> Поставте галочки на потрібні цілі.


2

Я не знайшов цю пропозицію тут, і ось так: якщо ваш проект має більше однієї цілі (тобто, одна для OSX і одна для iOS), тоді ви повинні зв’язати відповідні бібліотеки для кожної цілі .. так, наприклад, у моєму випадку я потрібен AudioToolbox .. Мені довелося додати його один раз для OSX і один раз для iOS (під папкою фреймворків ви повинні мати дублікат кожної бібліотеки для кожної цілі .. якщо ви бачите лише одну .. то це червоний прапор)


Ця відповідь мені допомогла. Однак моя ситуація була ще простішою вперед ... Я просто забув додати рамку, на яку посилалася моя база коду. У моєму випадку я не зміг завантажити AVFoundation.framework.
Джон Ерк

Так, я просто забув додати рамку під час фази "Пов’язати бінарне з бібліотеками".
Макс

2

У мене виникли проблеми з бібліотеками PJSIP,

Випробували наступне в інших прапорах лінкерів у проекті та змогли усунути помилку: -framework Foundation -framework UIKit

Над прапорцями Linker використовуються в Siphone Project над github . Ці налаштування допоможуть вирішити проблеми, пов’язані із зв’язуванням бібліотек C ++.


У мене така ж проблема з бібліотеками PJSIP. Чи можете ви детально пояснити рішення
Rajat Jain

Встановіть наступні значення в інших прапорах лінкерів налаштування побудови проекту: -framework Foundation -framework UIKit
Adeesh Jain

Повідомлення про помилку: ігноруючи файл /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, для архіву було створено файл, не пов’язаний з архітектурою (i386): / Користувачі /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Не визначені символи для архітектури i386: "_pjsip_register_method", з посиланням на:
Раджат Jain

Схоже, ви намагаєтеся запустити додаток на тренажері, а libyuv.a не побудований для архітектури імітатора i386. спробуйте запустити додаток безпосередньо на пристрої
Adeesh Jain

Я хочу інтегрувати Pjsip у Swift. Я спробував створити мостові заголовки, але це не вийшло. Чи можете ви дати мені якусь ідею?
Rajat Jain

1

Нарешті я зрозумів це, я вирішив цю проблему, додавши відсутні рамки до цільових-> Фази збірки-> Пов’язати бінарне з бібліотеками


1

У мене колись була ця проблема. Я зрозумів, що пересуваючи клас, я переписав його.mm файл.h файлом у папці призначення.

Виправлення цієї проблеми виправило помилку.


1

Я отримав помилку "Не визначені символи для архітектури armv7:" під час спроби скласти проект, у якого встановлено цільове значення збірки для "Стандартної бібліотеки C ++", встановлене на "libc ++" (необхідне, оскільки проект використовував деякі функції з C ++ 11), і проект включав підпроект, у якого встановлено той самий параметр, який встановлений на 'libstdc ++' (або за замовчуванням компілятора, як це є зараз).

Змінивши налаштування «С ++ Стандартна бібліотека» підпроекту на libc ++, виправлено це, але лише після першого встановлення цілі розгортання для підпроекту на 5,0 або вище (5,0 потрібне для libc ++).


1

Я даю вам більше пропозицій, які ви можете перевірити, коли інші поширені пропозиції не допомагають.

Якщо ви зв’язуєтесь з іншим проектом (libxxx.a), іноді ви можете зустріти дивну проблему, яку ви можете знайти символ за допомогою інструментів типу nm, але вони просто не можуть знайти символи в ld. Тоді слід перевірити, чи два проекти побудовані в одних і тих же прапорах, деякі з них можуть впливати на бінарний формат.

  1. перевірити компілятор c ++.
  2. перевірити налаштування діалектів c ++.
  3. перевірте підтримку типу + для виконання. (-frtti / -fnortti)
  4. перевірте, чи є .a з тим самим іменем відображене в іншому місці, може бути за межами потрібного файлу у списку шляхів посилання. видаліть їх.

1

У мене виникла ця проблема, коли я запускаю додаток на iphone5s , це було вирішено шляхом додавання arm64 до архітектури .


1

У мене була така ж проблема. Я спробував кожну річ з величезного списку відповідей, але врешті-решт моя проблема полягала в тому, що я працюю з openCV, тому мені потрібно поєднувати код C ++ у своєму коді. Для цього слід змінити файли, які використовують aim-c і C ++ на .mm. Я не змінив жодного файлу, і цей файл не має зв'язку з кодом C ++, але мені довелося його змінити.


1

У мене виникла ця проблема під час встановлення shareKit. Це працювало в тренажері, але не на пристрої. Я видалив -all_load з іншого прапора Linker, і все працює нормально як у симуляторі, так і на пристрої iphone.


1

У моєму випадку я додав рамку, яка повинна використовувати ціль C ++. Я знайшов цю публікацію:

XCode .m проти. Мм

це пояснило, як потрібно було перейменувати main.mmm на main.mm, щоб також можна було компілювати класи Objective-C ++.

Це зафіксувало це для мене.



1

Для мене проблема полягала в тому, що я забуваю встановити значення для своїх констант в .m (реалізація)

file const kFooKey = @"Foo";

1

Я також додав файли через "Перетягування". Що я зробив, я видалив посилання на всі файли (за винятком frameworks), після чого знову додав їх належним чином за допомогою опції Додати файли до проекту , проблема не зникла.


1

Якщо ви будуєте з Unity3D 5, а також використовуєте плагін Prime31, і ви отримуєте цю помилку, можливо, це пов'язано з дублікатом .dll. Якщо ви переглянете свої попередження в редакторі Unity, один із них скаже вам це і попередить, що це може призвести до помилок побудови. Щоб побачити, чи це так, введіть P31 у полі пошуку проекту, і він повинен з’являтися прямо, можливо, навіть більше, ніж одне. У дубліката буде "1" в кінці імені файлу. Можливо, це пов'язано з оновленням плагіна в редакторі через магазин або закладку меню Prime31.

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