Повторяющиеся проблемы с символами - PullRequest
61 голосов
/ 13 июля 2010

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

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

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

00008150 S _OBJC_IVAR _ $ _ TinCanViewController.currentViewController

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

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

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

Ответы [ 8 ]

237 голосов
/ 08 апреля 2011

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

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

31 голосов
/ 26 марта 2013

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

5 голосов
/ 24 декабря 2010

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

4 голосов
/ 24 марта 2015

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

3 голосов
/ 21 января 2011

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

Удачи !!!

1 голос
/ 13 июля 2010

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

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

0 голосов
/ 09 марта 2016

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

как это

lib.a - for device.

libCauly-universal.a - for simulator and device.

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

0 голосов
/ 24 июня 2014

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

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

Решение:

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

enter image description here

...