Неопределенные символы для архитектуры 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 и это не помогает, у кого-нибудь есть идеи?

37 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Шаги -

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

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

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

от libC++ (стандартная библиотека LLVM C++ с поддержкой C++11) до libstdC++ (стандартная библиотека GNU C++)

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

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

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

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

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

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

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

Это устранило мою проблему: зависимость, которую я использую, не поддерживает armv7. Так что у меня не было другого выхода, кроме как удалить его. В любом случае Armv7 используется только для очень старых iPhone (например, iPhone 4).

  • Перейдите в "Настройки сборки / Все".
  • Установите для параметра "Допустимые архитектуры" значение "arm64 arm64e"

Зайдите в ваш проект, нажмите на этапы сборки, скомпилируйте исходники, добавьте GameCenterManager.m в список.

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

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

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

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

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

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

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

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

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

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

file const kFooKey = @"Foo";

Что бы это ни стоило, мой был исправлен после того, как я пошел в target->Build Phases->Link Binary With Libraries, удалил ссылку libstdC++. Tbd, затем добавил ссылку на libstdC++.6.0.9.tbd.

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

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

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

XCode.m против.mm

это объясняет, как main.m нужно было переименовать в main.mm, чтобы классы Objective-C++ тоже можно было скомпилировать.

Это исправило это для меня.

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

Если вы работаете с Unity3D 5, а также используете плагин Prime31, и вы получаете эту ошибку, возможно, это связано с дублированием.dll. Если вы просмотрите свои предупреждения в редакторе Unity, одно из них сообщит вам об этом и предупредит, что это может вызвать ошибки сборки. Чтобы увидеть, так ли это, введите P31 в поле поиска проекта, и оно должно появиться прямо, возможно, даже больше, чем один. Дубликаты будут иметь "1" в конце имени файла. Вероятно, это связано с обновлением плагина в редакторе через магазин или вкладку меню Prime31.

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

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

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

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

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