Какой процесс прошел во время компиляции Objective-C - PullRequest
5 голосов
/ 04 февраля 2011

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

Может ли кто-нибудь дать мне обзор шагов, предпринятых во время компиляции?

Это, как я сейчас понимаю, процесс:

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

  2. Любые файлы .m компилируются в эквивалентный код C (который, в свою очередь, компилируется в объектный код).

  3. Компоновщик создает ссылки между объявлениями, сделанными в файлах .h, и соответствующими функциями в объектном коде. Соответствующие функции определяются путем поиска их в файле .m с тем же именем.

  4. Объектные файлы соединены вместе, чтобы сформировать исполняемый файл, убедившись, что основная функция находится в точке входа исполняемого файла. Любые объявления затем предположительно удаляются для экономии места?

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

Спасибо за любое освещение, которое любой может принести этому:).

Приветствия

Danny

1 Ответ

3 голосов
/ 04 февраля 2011

Вы понимаете идею более или менее правильно. Несколько исправлений:

  1. #include не проверяет, включено ли оно или нет, но #import проверяет.

  2. .m сначала не преобразуется в C, а затем в объектный код. Это было сделано 20 лет назад, но это уже не так. Он просто скомпилирован в объектный код.

  3. Компоновщику все равно, как был назван файл. Вы можете использовать разные имена файлов для .h и .m. Например, вы можете разделить реализации функций, объявленных в файле .h, на несколько файлов .m.

  4. Будет ли удалена неиспользуемая реализация или нет, зависит от компилятора и параметров компилятора.

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

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