Почему XCode компилирует весь мой код дважды, что приводит к ошибкам компоновщика для любых глобальных переменных? - PullRequest
3 голосов
/ 23 ноября 2010

Когда я смотрю в окно «Результаты сборки», для каждого файла Compile .m, Precompile .pch и Link есть дубликаты.

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

На этапе связывания я вижу, что один прогон предназначен для armv6, а другой - для armv7 (при компиляции для устройства iOS).

Однако при компиляции для симулятора iOS ошибок дублирования и компоновки не было.

Это проблема (помимо очевидной проблемы ошибок компоновщика)? Если так, это вызовет проблемы с производительностью? Как я могу исправить это?

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Я уверен, что двойные сообщения вызваны компиляцией Universal App.

0 голосов
/ 24 ноября 2010

Вы не должны помещать определения в заголовочный файл.

Объявления - это такие вещи, как int add(int a, int b); и extern int c;.

Определения - это такие вещи, как int add(int a, int b) { return a+b; } и int c;.

Если вы определяете глобальную переменную int c; в заголовочном файле, каждый исходный файл, который включает в себя #include, будет определять символ с именем "c". Компоновщику это не нравится: есть 2 (или 3, или 4 ...) разные вещи, называемые c, но все они должны указывать на одну и ту же. Какой из них следует использовать? (Это эквивалентно определению двух (нестатических) функций с одинаковым именем или двух классов с одинаковым именем.)

Вместо этого введите extern int c; в заголовочный файл и int c; в один исходный файл.

(«Дублирующие» компиляции для armv6 и armv7 совершенно нормальны. Две архитектуры скомпилированы и связаны отдельно, а затем скомпилированы в «толстый» исполняемый файл. В общем, armv6 работает на «старых» устройствах (до 3GS) armv7 работает на «новых» устройствах (3GS +). «Новые» устройства также могут работать на armv6, но armv7 намного быстрее.)

0 голосов
/ 23 ноября 2010

Краткий ответ: не используйте глобалы.: D Посмотрите extern используйте с целью-c , это может помочь вам с созданием глобальных.Если вы создаете для arm6 и arm7, у вас будут повторяющиеся записи о сборке, поскольку они являются различными сборками.

Вероятно, что произойдет, когда вы создадите static const как глобальный объект, который будет определен в каждом файле.Поместите его в один .m файл и добавьте ключевое слово extern в другие.Однако это может быть неправильно, так как я не использую глобалы.(и вы не должны: D)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...