Undefined символы для архитектуры armv7

Эта проблема сводила меня с ума, и я не могу понять, как ее исправить...

    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 и это не помогает, у кого-нибудь есть идеи?

Ответ 1

Общие причины

Общими причинами для символов Undefined для архитектуры armv7 являются:

  • импортировать заголовок и не ссылаться на нужную библиотеку. Это обычное явление, особенно для заголовков таких библиотек, как 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.

  • Вы копируете файлы в свой проект, но забыли проверить цель, чтобы добавить файлы в. Чтобы решить:

    • Откройте Build Phases для правильной цели, разверните Compile Sources и добавьте отсутствующие файлы .m. Если это ваша проблема, пожалуйста, поддержите ответ Cortex ниже.

  • Вы включаете статическую библиотеку, созданную для другой архитектуры, например i386, симулятор на вашем хост-компьютере. Чтобы решить:

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

    • По желанию вы можете создать старую старую библиотеку, которая содержит обе архитектуры.



Исходный ответ:

Вы не связаны с правильным файлом libz. Если вы щелкните правой кнопкой мыши файл и обнаружите в finder, его путь должен находиться где-то в папке sdk iOS. Вот мой пример

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

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

Ответ 2

У меня была аналогичная проблема прошлой ночью, и проблема была связана с тем, что я перетащил класс из Finder в мой проект в Xcode.

Решение состояло в том, чтобы перейти на вкладку "Сборка фаз", а затем "Источники компиляции" и убедиться, что вы перетащите класс в список.

Ответ 3

У меня была аналогичная проблема, и мне приходилось проверять только "Build Active Architecture Only" в каждой из конфигураций Project (Debug, Release and Deployment) и в настройках сборки Target.

Ответ 5

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

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

  • удалите класс из списка навигации и выберите "удалить ссылку только"

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

Ответ 6

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

Ответ 7

В разделе Target → Настройки сборки → Язык компилятора Apple LLVM: установка "С++ Language Dialect" и "С++ Standard Library" на компилятор по умолчанию помогла решить проблему.

Ответ 8

Вот как я получил эту проблему:

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

Отметьте мой ответ, потому что у меня была аналогичная проблема, которую я смог решить, выполнив несколько шагов.

Ответ 9

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

Шаги -

  • Перейдите в раздел "Сборка фаз".
  • Ссылка Binary С библиотекой - используйте кнопку "+" для выбора фреймворков и библиотек для добавления.
  • Выберите libz.1.2.5.dylib из списка.
  • Сборка и запуск.

Ответ 10

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

Ответ 11

У меня была аналогичная проблема, и я видел ошибки, связанные с "std::"

Я изменил настройки сборки → Apple LVM 5.0 - Язык С++ → Стандартная библиотека С++

из libС++ (стандартная библиотека LLVM С++ с поддержкой С++ 11) в libstdС++ (стандартная библиотека GNU С++)

Ответ 12

если вы имеете дело с обновлением iOS5, я обнаружил, что для компиляции проекта, написанного для 4.3, я мог бы просто переименовать libz.1.2.3.dynlib в Навигаторе проектов в libz.1.2.5.dynlib, и он скомпилирован.

В моей папке iPhoneOS50SDK/usr/lib нет libz.1.2.3.dynlib - не знаю, является ли это бета-версией или просто естественным обновлением.

Ответ 13

Перейдите в свой проект, нажмите "Фазы сборки", "Скомпилируйте источники", "Добавить GameCenterManager.m" в список.

Ответ 14

Если у вас есть флаг -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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

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

Ответ 18

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

Ответ 19

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

Ответ 20

Я использую эту проблему, когда модуль (файл .m) не находится в объекте, с которым я работаю.

Ответ 21

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

file const kFooKey = @"Foo";

Ответ 22

Я также добавил файлы через Draging and Dropping. Что я сделал, я удалил ссылки на все файлы (исключая frameworks), а затем добавил их правильно через параметр Добавить файлы в проект, проблема исчезла.

Ответ 23

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

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

Итак: Выбрать класс Утилиты (инспектор файлов) Целевое членство Отметьте цели, которые вы хотите.

Ответ 24

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

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

Ответ 25

У меня возникла такая же проблема, когда я включил одну стороннюю структуру.

Проблема была решена, когда я удалил armv7 из записи "Действительные архитектуры" в настройках сборки цели, она начинает работать.

Ответ 26

Я получил символ Undefined для архитектуры armv7: 'при попытке скомпилировать проект с настройкой целевой сборки для "Стандартной библиотеки С++", установленной в "libС++" (необходимо, поскольку в проекте использовались некоторые функции из С++ 11), а проект включал подпроект, который имел тот же набор уставок, что и "libstdС++" (или компилятор по умолчанию, как и в настоящее время).

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

Ответ 27

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

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

  • проверить компилятор С++.
  • проверить настройку диалекта С++.
  • проверить поддержку типа времени выполнения С++. (-frtti/-fnortti)
  • проверьте, есть ли .a с тем же именем, который появляется в другом месте, может быть за пределами желаемого файла в списке путей ссылки. удалите их.

Ответ 28

переименуйте свой файл m (который включает методы funcs) в mm или наоборот, исправит вашу проблему. шахта решила переименовать мм в м или от m до мм.

Ответ 29

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

Ответ 30

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