Неопределенные символы для архитектуры armv7 - PullRequest
299 голосов
/ 21 июня 2011

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

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

Ответы [ 37 ]

493 голосов
/ 21 июня 2011

Распространенные причины

Распространенными причинами для «Неопределенные символы для архитектуры 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.Вот мой пример

/ Разработчик / Платформы / iPhoneOS.platform / Разработчик / SDKs / iPhoneOS4.3.sdk / usr / lib

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

197 голосов
/ 16 апреля 2012

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

Решением было перейти на вкладку «Фазы сборки», а затем «Компилировать источники» и убедиться, что вы перетаскиваете класс в список.

37 голосов
/ 20 декабря 2011

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

20 голосов
/ 13 марта 2013

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

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

14 голосов
/ 09 мая 2012

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

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

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

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

8 голосов
/ 25 сентября 2011

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

5 голосов
/ 16 ноября 2013

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

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

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

5 голосов
/ 07 ноября 2012

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

4 голосов
/ 22 августа 2013

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

Шаги -

  1. Перейти к этапам сборки.
  2. Link Binary With library - используйте кнопку «+», чтобы выбрать рамки и библиотеки для добавления.
  3. Выберите libz.1.2.5.dylib из списка.
  4. Сборка и запуск.
4 голосов
/ 18 апреля 2013

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

...