Повторяющиеся проблемы с символами

Во время рефакторинга проекта iOS я столкнулся с этим медведем ошибки. Во время фазы связывания я получаю это сообщение:

ld: дублировать символ _OBJC_IVAR _ $_ TinCanViewController.currentViewController в /path/to/TinCanViewController -E98A666B7AF2673A.o и/path/to/TinCanViewController-E98A666B7AF2673A.o

Насколько я могу судить, похоже, что TinCanViewController-E98A666B7AF2673A.o объявляет указанный символ дважды; оба пути указывают на тот же самый файл .o. Я запустил nm в этом конкретном файле и только один раз включил этот символ:

00008150 S _OBJC_IVAR _ $_ TinCanViewController.currentViewController

Я запустил nm во всех других .o файлах в каталоге, чтобы убедиться, что они каким-то образом объявили этот символ, но это не так. Это происходит с любым членом, который я добавляю в класс TinCanViewController - он не специфичен для currentViewController.

Мне кажется, что я каким-то образом каким-то образом свяжусь с классом, но я довольно усердно прошел и проверил все ссылки на этот класс. В рефакторинговой версии в основном нет. AppDelegate включает его, но сейчас это просто простой класс, который загружает другой ViewController с самого начала. Никакие другие классы в проекте не включают его.

Любые предложения о том, что может вызвать это или как я могу отладить его лучше?

Ответ 1

У меня была эта проблема на последнем Xcode 4. Причина: я включил file.m вместо file.h

Возможно, вы включили TinCanViewController.m (должно быть TinCanViewController.h)

Ответ 2

У меня это случилось, но моя проблема была связана с проблемами слияния из нашего репо. Файл .m был указан дважды в месте, которое должно быть указано только один раз (внутри проекта, но не внутри структуры файла/группы, поэтому вы не могли видеть проблему в Xcode, только ошибка). Исправление открывает файл .pbxproj внутри вашего файла проекта и находит дубликат записи в этом файле. После удаления дубликата проект был построен просто отлично.

Ответ 3

Я случайно включил файл .h и .m файл дважды в проект. Как только я удалил вторую копию, ошибка исчезла.

Ответ 4

Эта проблема решена здесь, когда я удалил (используя Xcode) все файлы .m и .h из папки класса, затем очистил Project (Command + Shift + K) и снова создал. Поэтому я снова перетаскиваю файлы из Finder в Class Folder в Xcode. Наконец, я снова очистил и построил свой проект...

Удачи!!!

Ответ 5

Убедитесь, что делегат .m указан только один раз в файлах компиляции.

Ответ 6

Я думаю, что это ошибка с последним компоновщиком Apple при создании универсальных статических библиотек. Я не могу найти номер ошибки в настоящее время, но это происходит из-за того, что он неправильно генерирует armv6 и armv7 без их устранения.

Чтобы убедиться, что это так, измените конфигурацию, чтобы построить только armv6 или amv7, и у вас не будет этой проблемы.

Ответ 7

Это также может произойти, если у вас есть проект с несколькими целевыми объектами, а две цели имеют тот же файл, что и abc.m, и что для обеих целей выбран abc.m.

Что случилось в моем случае, у меня было две цели с именем ABC и XYZ, и у обоих был свой собственный файл DiagramViewController.m, который должен запускать код для своих целей. Я случайно имел DiagramViewController.m цели ABC, которая была выбрана для XYZ.

Решение:

Нажмите файл .m, перейдите к инспектору файла и отмените выбор дополнительной цели.

enter image description here

Ответ 8

У меня была такая же проблема. проблема заключалась в том, что у меня были две библиотеки, содержащие один и тот же файл .m.

как это

lib.a - for device.

libCauly-universal.a - for simulator and device.

поэтому я удалил один.