Неопределенные символы для архитектуры 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), видны. Смотрите мой ответ, если это так: stackoverflow.com/a/26151208/901641
ArtOfWarfare

2
Как показывает практика, SomeCimes XCode выдает такие ошибки, как Match-O и символ, не найденный для архитектуры i386 (или другой), когда файлы не были добавлены в проект. Вы можете щелкнуть правой кнопкой мыши папку проекта и сделать «Добавить файл в <проект>».
Fabricio PH

Вы можете увидеть конкретные символы, созданные с помощью инструмента nm. Перейдите к пути к файлам .o и запустите 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. Если вы щелкнете правой кнопкой мыши по файлу и обнаружите в искателе, его путь должен быть где-то в папке iOS SDK. Вот мой например

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

Я рекомендую удалить ссылку, а затем повторно добавить ее обратно в раздел «Связать двоичные файлы с библиотеками». Этапы сборки вашей цели.


4
Это также может быть связано с тем, что вам нужно добавить слово «-licucore» в настройках проекта / «Другие флаги компоновщика». Он был добавлен автоматически для моей отладочной сборки, но не для релизной, поэтому не будет компилироваться.
JulianB

4
Я была такая же проблема. На самом деле не читал примечания по установке должным образом, поэтому не заметил, что новая версия bugsense нуждается в добавлении двоичного файла libz на этапах сборки.
Макс МакЛауд

2
Вы уверены, что включили раздел @implementation в свой соответствующий файл .m для всех классов, которые вы объявили в своем заголовочном файле?
Slcott

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

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

198

Вчера вечером у меня была похожая проблема, и проблема была связана с тем, что я перетащил класс из Finder в свой проект в Xcode.

Решение состояло в том, чтобы перейти на вкладку Build Phases и затем Compile Sources и убедиться, что вы перетаскиваете класс в список.


6
Хотелось бы, чтобы я понял, что это был ответ, который я искал раньше. В качестве альтернативы вы можете убедиться, что отметили «Добавить к целям» при копировании классов.
Т. Маркл

1
Вау ... так рада, что это было легко! Для ясности, если вы добавляете класс путем перетаскивания из поиска в ваш проект, XCode не всегда добавляет их в список фаз сборки. Я просто нажал кнопку «+» в «Компиляции источников» на этапах сборки, добавил все оскорбительные файлы и сразу же скомпилировал.
Амос

1
Вот это да. Apple действительно нужно пересмотреть свои сообщения об ошибках.
devios1

2
Другой способ исправить это - выбрать файл, который, как говорят, отсутствует. и откройте выдвижную панель «Утилиты». (Это крайний правый) И выберите «Инспектор файлов». Затем убедитесь, что есть проверка в проекте в разделе «Целевое членство». Я использую Xcode 4.6.2
zingle-dingle

1
Я не знал, какой файл отсутствовал, поэтому я показал фазы сборки в помощнике редактора (второй вид редактирования). Я открыл поврежденный файл в левом окне редактирования и проверил, существует ли каждый из импортированных файлов на этапах сборки. Я добавил тот, который не сделал, и это было решено.
Дэн Сэндленд

38

У меня была похожая проблема, и мне приходилось проверять «Построить только активную архитектуру» в каждой конфигурации проекта (отладка, выпуск и развертывание) и в настройках сборки цели.


3
Также сделал трюк для меня. Хотя это было просто необходимо в основном проекте.
Kirualex

4
Я сталкиваюсь с теми же проблемами. Эти Build Active Architecture Onlyнастройки отличаются между Podsи мой проект. На этапе ссылки это не удалось.
AechoLiu

21

Другой возможной причиной ошибок компоновщика «неопределенный символ» является попытка вызвать функцию C из файла .mm. В этом случае вам нужно будет использовать extern "C" {...} при импорте файлов заголовков.

Ошибка компоновщика при вызове C-функции из Objective-C ++


14

У меня была похожая проблема с этим. Имя класса после _OBJC_CLASS _ $ _ было фактически моим классом. Причина была в том, что я не поставил галочку «Добавить в цель», когда перетаскивал файлы исходного кода в список навигации.

Мое решение было:

  1. удалите класс из списка навигации и выберите «удалить только ссылку»

  2. снова перетащите файлы с исходным кодом и убедитесь, что флажок «Добавить в цель» отмечен. Галочка находится под «Копировать при необходимости» и «Создать группу».


Просто добавлю: хотя это НЕ САМАЯ ОБЩАЯ ПРИЧИНА ошибки, я просто ваш ответ (не поставил галочку) произойдет со мной сейчас.
Адам

8

Обычно существует псевдоним без идентификатора версии, который связан с текущей версией, в этом случае libz.dylib связан с libz.1.2.5.dylib. Используйте базовый псевдоним вместо версионного.


5

Под Target -> Build Settings -> Язык компилятора Apple LLVM: установка 'C ++ Language Dialect' и 'C ++ Standard Library' на значение по умолчанию для компилятора помогла решить эту проблему.


5

Я только добавил libz.1.2.5.dylib в мой проект, и он работал как шарм.

Шаги -

  1. Перейти к этапам сборки.
  2. Link Binary With library - используйте кнопку «+», чтобы выбрать рамки и библиотеки для добавления.
  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

У меня есть несколько @interfaces в файле .h, и я еще не включил все соответствующие директивы @implementation. Убедитесь, что они все сбалансированы.


4

Если у вас есть флаг -ObjCпод вашей Целью> Настройки сборки> Другие флаги компоновщика, и вы получаете эту проблему, рассмотрите возможность ее удаления. Если вы намеренно добавили его, потому что вам нужно загрузить некоторый код 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

Возможно, некоторые классы отсутствуют в вашей цели. Обычно это происходит, когда вы переименовываете / удаляете / добавляете новые файлы классов в ваш проект. Чтобы исправить, добавьте новые классы для некоторых целей.

Выберите класс в Навигаторе проекта (правая боковая панель), откройте боковую панель «Утилиты» (правая боковая панель), в меню «Утилиты» выберите «Инспектор файлов» (значок в виде файла), на вкладке «Членство в целевой группе» отметьте свои цели. Это все, чтобы избежать «Удалить ссылку» и добавить еще раз с помощью галочки «Добавить к целям».

Итак: Выберите Class -> Utilities (File Inspector) -> Target Membership -> Отметьте нужные цели.


2

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


Этот ответ помог мне. Однако моя ситуация была еще более прямой ... Я просто забыл добавить фреймворк, на который ссылалась моя кодовая база. В моем случае мне не удалось загрузить AVFoundation.framework.
Джон Эрк

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

2

Я столкнулся с проблемой с библиотеками PJSIP,

Попробовал следующее в других флагах компоновщика в проекте и смог устранить ошибку: -framework Foundation -framework UIKit

Вышеупомянутые флаги компоновщика используются в Siphone Project поверх github . Эти настройки помогут вам решить проблемы, связанные с подключением библиотек C ++.


У меня такая же проблема с библиотеками PJSIP. Можете ли вы объяснить решение в деталях
Раджат Джайн

Установите следующие значения в других флагах компоновщика при настройке сборки проекта: -framework Foundation -framework UIKit
Adeesh Jain

Сообщение об ошибке: игнорирование файла /Users/user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a, файл создан для архива, который не связан с архитектурой (i386): / Users /user/Downloads/pjproject-2.7.2/pjsip-apps/src/pjsua/ios/libyuv.a Неопределенные символы для архитектуры i386: «_pjsip_register_method», по ссылке:
Раджат Джайн

Похоже, вы пытаетесь запустить приложение на симуляторе, а libyuv.a не создан для архитектуры симулятора i386. попробуйте запустить приложение на устройстве напрямую
Adeesh Jain

Я хочу интегрировать Pjsip в Swift. Я пытался создать мостовые заголовки, но это не сработало. Можете ли вы дать мне идею?
Раджат Джайн

1

Наконец, я понял, я решил эту проблему, добавив отсутствующий фреймворк в target-> Build Phases-> Link Binary With Libraries


1

У меня когда-то была эта проблема. Я понял, что, перемещая класс, я переписал .mmфайл с .hфайлом в папке назначения.

Исправление этой проблемы исправило ошибку.


1

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

Изменение параметра «Стандартная библиотека C ++» для подпроекта на libc ++ исправило его, но только после первого задания цели развертывания для подпроекта на уровне 5.0 или выше (для libc ++ необходимо 5.0).


1

Я даю вам больше предложений, которые вы можете проверить, когда другие общие предложения не помогают.

Если вы свяжетесь с другим проектом (libxxx.a), вы можете столкнуться со странной проблемой: вы можете найти символ с помощью инструментов, таких как nm, но они просто не могут найти символы в ld. Затем вы должны проверить, построены ли два проекта в одинаковых флагах, некоторые из них могут повлиять на двоичный формат.

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

1

Я получил эту проблему, когда я запускаю приложение на iphone5s , она была решена путем добавления arm64 в архитектуру .


1

У меня такая же проблема. Я попробовал все из огромного списка ответов, но в итоге моя проблема была: я работаю с openCV, поэтому мне нужно объединить код C ++ в моем коде. Чтобы сделать это, вы должны изменить файлы, которые используют target-c и C ++, на .mm. Я не изменил ни один файл, и этот файл не имеет связи с кодом C ++, но мне пришлось его изменить.


1

У меня была эта проблема, при установке shareKit. Работало в симуляторе, но не на устройстве. Я удалил -all_load с флага другого компоновщика, и все отлично работает как на симуляторе, так и на устройстве iphone.


1

В моем случае я добавил платформу, которая должна использовать Objective C ++. Я нашел этот пост:

XCode .m против .mm

это объясняло, как main.m нужно было переименовать в 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.