Неопределенные символы для архитектуры 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":
Вы импортируете заголовок и не ссылаетесь на правильную библиотеку. Это часто встречается, особенно для заголовков для библиотек, таких как 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. Если вы щелкнете правой кнопкой мыши по файлу и обнаружите в искателе, его путь должен быть где-то в папке iOS SDK. Вот мой например
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/usr/lib
Я рекомендую удалить ссылку, а затем повторно добавить ее обратно в раздел "Связать двоичные файлы с библиотеками". Этапы сборки вашей цели.
Вчера вечером у меня была похожая проблема, и проблема была связана с тем, что я перетащил класс из Finder в свой проект в Xcode.
Решение состояло в том, чтобы перейти на вкладку Build Phases и затем Compile Sources и убедиться, что вы перетаскиваете класс в список.
У меня была похожая проблема, и мне приходилось проверять "Построить только активную архитектуру" в каждой конфигурации проекта (отладка, выпуск и развертывание) и в настройках сборки объекта-цели.
Другая возможная причина ошибок компоновщика "неопределенный символ" - попытка вызова функции C из файла.mm. В этом случае вам нужно будет использовать extern "C" {...} при импорте файлов заголовков.
У меня была похожая проблема с этим. Имя класса после _OBJC_CLASS_$_ было фактически моим классом. Причина была в том, что я не поставил галочку "Добавить в цель", когда перетаскивал файлы с исходным кодом в список навигации.
Мое решение было:
удалите класс из списка навигации и выберите "удалить только ссылку"
снова перетащите файлы с исходным кодом и убедитесь, что флажок "добавить в цель" отмечен. Галочка находится под "Копировать при необходимости" и "Создать группу".
Обычно существует псевдоним без идентификатора версии, который связан с текущей версией, в этом случае 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 в мой проект, и он работал как шарм.
Шаги -
- Перейти к этапам сборки.
- Link Binary With library - используйте кнопку "+", чтобы выбрать рамки и библиотеки для добавления.
- Выберите libz.1.2.5.dylib из списка.
- Сборка и запуск.
У меня была похожая проблема, и я видел ошибки, связанные с "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++. Я нашел этот пост:
это объясняет, как 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. Затем вы должны проверить, построены ли два проекта в одинаковых флагах, некоторые из них могут повлиять на двоичный формат.
- проверьте компилятор C++.
- проверьте настройку диалекта с ++.
- проверьте поддержку C++ во время выполнения. (-Frtti/-fnortti)
- проверьте, есть ли.a с тем же именем в другом месте, может быть за пределами требуемого файла в списке пути ссылки. удалить их.