Эта проблема сводит меня с ума, и я не могу решить, как ее исправить ...
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/901641nm -g
файл, который вызывает символ, и тот, который должен иметь символ, и вы должны увидеть, совпадают ли они или нет, что может дать подсказки для ошибки. nm -g file.o Вы можете проверить символы C ++, разбитые на это: nm -gC file.oUndefined 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)
Ответы:
Общие причины
Распространенные причины для «неопределенных символов для архитектуры 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. Вот мой например
Я рекомендую удалить ссылку, а затем повторно добавить ее обратно в раздел «Связать двоичные файлы с библиотеками». Этапы сборки вашей цели.
источник
-framework <FrameWorkName>
. У меня были проблемы с XCTest, поэтому мне пришлось добавить-framework XCTest
. Спасибо! :)Вчера вечером у меня была похожая проблема, и проблема была связана с тем, что я перетащил класс из Finder в свой проект в Xcode.
Решение состояло в том, чтобы перейти на вкладку Build Phases и затем Compile Sources и убедиться, что вы перетаскиваете класс в список.
источник
У меня была похожая проблема, и мне приходилось проверять «Построить только активную архитектуру» в каждой конфигурации проекта (отладка, выпуск и развертывание) и в настройках сборки цели.
источник
Build Active Architecture Only
настройки отличаются междуPods
и мой проект. На этапе ссылки это не удалось.Другой возможной причиной ошибок компоновщика «неопределенный символ» является попытка вызвать функцию C из файла .mm. В этом случае вам нужно будет использовать extern "C" {...} при импорте файлов заголовков.
Ошибка компоновщика при вызове C-функции из Objective-C ++
источник
У меня была похожая проблема с этим. Имя класса после _OBJC_CLASS _ $ _ было фактически моим классом. Причина была в том, что я не поставил галочку «Добавить в цель», когда перетаскивал файлы исходного кода в список навигации.
Мое решение было:
удалите класс из списка навигации и выберите «удалить только ссылку»
снова перетащите файлы с исходным кодом и убедитесь, что флажок «Добавить в цель» отмечен. Галочка находится под «Копировать при необходимости» и «Создать группу».
источник
Обычно существует псевдоним без идентификатора версии, который связан с текущей версией, в этом случае libz.dylib связан с libz.1.2.5.dylib. Используйте базовый псевдоним вместо версионного.
источник
Под Target -> Build Settings -> Язык компилятора Apple LLVM: установка 'C ++ Language Dialect' и 'C ++ Standard Library' на значение по умолчанию для компилятора помогла решить эту проблему.
источник
Я только добавил libz.1.2.5.dylib в мой проект, и он работал как шарм.
Шаги -
источник
У меня была похожая проблема, и я видел ошибки, связанные с "std ::"
Я изменил Настройки сборки -> Apple LVM 5.0 - Язык C ++ -> Стандартная библиотека C ++
от libc ++ (стандартная библиотека LLVM C ++ с поддержкой C ++ 11) до libstdc ++ (стандартная библиотека GNU C ++)
источник
У меня была такая же проблема, когда я использовал библиотеку admob, я исправил ее, изменив «Архитектуры» на «Стандартные архитектуры armv7, armv7s», не включая 64-битную.
источник
У меня есть несколько @interfaces в файле .h, и я еще не включил все соответствующие директивы @implementation. Убедитесь, что они все сбалансированы.
источник
Если у вас есть флаг
-ObjC
под вашей Целью> Настройки сборки> Другие флаги компоновщика, и вы получаете эту проблему, рассмотрите возможность ее удаления. Если вы намеренно добавили его, потому что вам нужно загрузить некоторый код Obj-C из статической библиотеки, который обычно не загружался бы иначе, IE, категория Obj-C, тогда вам следует использовать-force_load <path>
вместо-ObjC
.<path>
должно быть относительно вашего каталога проекта XCode. IE, если ваша структура каталогов выглядит так:Тогда вы должны установить этот флаг для
Other Linker Flags
:Если вы хотите включить несколько таких библиотек, то вы должны включить отдельную
-force_load
строку для каждой из них.источник
Вот как у меня появилась эта проблема:
Я добавил .h, .m и NIB из другого проекта, перетащив их в навигатор проекта. XCode не добавил их к фазам сборки должным образом.
Проверьте мой ответ, потому что у меня была похожая проблема, которую я смог решить, выполнив несколько шагов.
источник
если вы имеете дело с обновлением iOS5, я обнаружил, что для компиляции проекта, написанного для цели 4.3, я мог бы просто переименовать libz.1.2.3.dynlib в Навигаторе проекта в libz.1.2.5.dynlib, и он скомпилировался.
Моя папка iPhoneOS50SDK / usr / lib не содержит libz.1.2.3.dynlib - не знаю, является ли она бета-версией или просто естественным обновлением.
источник
Зайдите в ваш проект, нажмите на фазы сборки, скомпилируйте исходники, добавьте GameCenterManager.m в список.
источник
Возможно, некоторые классы отсутствуют в вашей цели. Обычно это происходит, когда вы переименовываете / удаляете / добавляете новые файлы классов в ваш проект. Чтобы исправить, добавьте новые классы для некоторых целей.
Выберите класс в Навигаторе проекта (правая боковая панель), откройте боковую панель «Утилиты» (правая боковая панель), в меню «Утилиты» выберите «Инспектор файлов» (значок в виде файла), на вкладке «Членство в целевой группе» отметьте свои цели. Это все, чтобы избежать «Удалить ссылку» и добавить еще раз с помощью галочки «Добавить к целям».
Итак: Выберите Class -> Utilities (File Inspector) -> Target Membership -> Отметьте нужные цели.
источник
Я не нашел это предложение здесь, поэтому вот оно: если у вашего проекта более одной цели (то есть одна для OSX и одна для iOS), то вы должны связать соответствующие библиотеки для каждой цели ... так, например, в моем случае я нужен AudioToolbox .. Мне пришлось добавить его один раз для OSX и один раз для iOS (в папке frameworks у вас должна быть копия каждой библиотеки для каждой цели ... если вы видите только одну ... тогда это красный флаг)
источник
Я столкнулся с проблемой с библиотеками PJSIP,
Попробовал следующее в других флагах компоновщика в проекте и смог устранить ошибку: -framework Foundation -framework UIKit
Вышеупомянутые флаги компоновщика используются в Siphone Project поверх github . Эти настройки помогут вам решить проблемы, связанные с подключением библиотек C ++.
источник
Наконец, я понял, я решил эту проблему, добавив отсутствующий фреймворк в target-> Build Phases-> Link Binary With Libraries
источник
У меня когда-то была эта проблема. Я понял, что, перемещая класс, я переписал
.mm
файл с.h
файлом в папке назначения.Исправление этой проблемы исправило ошибку.
источник
Я получил сообщение «Неопределенные символы для архитектуры armv7:» при попытке скомпилировать проект, в котором для целевой установки сборки для «Стандартной библиотеки C ++» установлено значение «libc ++» (необходимо, так как проект использовал некоторые функции из C ++ 11), и проект включал в себя подпроект, для которого были установлены те же настройки, что и для libstdc ++ (или для компилятора по умолчанию, как в настоящее время).
Изменение параметра «Стандартная библиотека C ++» для подпроекта на libc ++ исправило его, но только после первого задания цели развертывания для подпроекта на уровне 5.0 или выше (для libc ++ необходимо 5.0).
источник
Я даю вам больше предложений, которые вы можете проверить, когда другие общие предложения не помогают.
Если вы свяжетесь с другим проектом (libxxx.a), вы можете столкнуться со странной проблемой: вы можете найти символ с помощью инструментов, таких как nm, но они просто не могут найти символы в ld. Затем вы должны проверить, построены ли два проекта в одинаковых флагах, некоторые из них могут повлиять на двоичный формат.
источник
Я получил эту проблему, когда я запускаю приложение на iphone5s , она была решена путем добавления arm64 в архитектуру .
источник
У меня такая же проблема. Я попробовал все из огромного списка ответов, но в итоге моя проблема была: я работаю с openCV, поэтому мне нужно объединить код C ++ в моем коде. Чтобы сделать это, вы должны изменить файлы, которые используют target-c и C ++, на .mm. Я не изменил ни один файл, и этот файл не имеет связи с кодом C ++, но мне пришлось его изменить.
источник
У меня была эта проблема, при установке shareKit. Работало в симуляторе, но не на устройстве. Я удалил -all_load с флага другого компоновщика, и все отлично работает как на симуляторе, так и на устройстве iphone.
источник
В моем случае я добавил платформу, которая должна использовать Objective C ++. Я нашел этот пост:
XCode .m против .mm
это объясняло, как main.m нужно было переименовать в main.mm, чтобы классы Objective-C ++ тоже можно было компилировать.
Это исправило это для меня.
источник
Я использую для решения этой проблемы, когда модуль (файл .m) не находится в цель, с которой я работаю.
источник
Для меня проблема была в том, что я забыл установить значение для моих констант в .m (реализация)
источник
Я также добавил файлы с помощью перетаскивания. Что я сделал, я удалил ссылки на все файлы (исключая
frameworks
), а затем снова добавил их правильно через опцию Добавить файлы в проект , проблема исчезла.источник
Если вы строите из Unity3D 5, а также используете плагин Prime31, и вы получаете эту ошибку, возможно, это связано с дублированием .dll. Если вы просмотрите свои предупреждения в редакторе Unity, одно из них сообщит вам об этом и предупредит, что это может привести к ошибкам сборки. Чтобы увидеть, так ли это, введите P31 в поле поиска проекта, и оно должно появиться прямо, возможно, даже больше, чем один. Дубликат будет иметь «1» в конце имени файла. Вероятно, это связано с обновлением плагина в редакторе через магазин или вкладку меню Prime31.
источник