Как я могу убедить Xcode выдать ошибку компоновщика повторяющихся символов?

Вот еще одно отличие от обычной путаницы с ошибками повторяющихся символов... :-)

Я работаю над некоторым устаревшим кодом Mac в проекте Xcode, который имеет одну и ту же глобальную «трассировку», определенную в нескольких разных исходных файлах, например:

  • File1.c: трассировка SInt32;
  • File2.c: Логическая трассировка;

и т. д. Понятно, что первоначальный автор имел в виду, что они имеют область действия, специфичную для файла, но просто забыл добавить к любой из этих строк префикс «статический». Это нормально, достаточно легко исправить.

Но я немного шокирован тем, что компоновщик не помечает их! Мне кажется, что компоновщик Xcode (я предполагаю, что gnu ld) выдает только повторяющиеся предупреждения или ошибки символов для функций, которые связаны с сегментом кода, но не глобальные переменные, которые связаны с сегментом данных. Вместо этого он молча объединяет их, что вызывает ошибки.

Итак... как мне убедить Xcode выдавать ошибки ссылок для повторяющихся глобальных переменных? Или получить эту информацию каким-то другим способом, который может быть рутинной частью моей сборки?


person Bob Murphy    schedule 23.03.2011    source источник


Ответы (1)


Ну, я думал, что ответил на свой вопрос... :-)

Я писал ранее:

Поэтому, если вы используете Xcode с LLVM GCC 4.2, перейдите в диалоговое окно настроек сборки, найдите раздел «LLVM GCC 4.2 — Генерация кода» и установите флажок «Без общих блоков». Это включает опцию компилятора "-fno-common" и изменяет генерацию объектных файлов, так что ld будет задыхаться и выдавать ошибку, если у вас есть две глобальные переменные в разных исходных файлах с одинаковыми именами.

К сожалению, похоже, это не решает все случаи. Кажется, все работает нормально, если все глобальные переменные имеют один и тот же тип.

Но пример в вопросе взят прямо из кода, где переменная с именем «trace» определена как глобальная в двух разных файлах с двумя разными типами. И это все еще не улавливается системой сборки, когда я устанавливаю этот флажок.

person Bob Murphy    schedule 23.03.2011
comment
может быть, поиск оскорбительной статьи по всему проекту, если у вас есть один экземпляр? - person MCannon; 24.03.2011
comment
Что ж, да, это часть исправления, если вы знаете, каково имя вызывающей нарушение переменной. Вопрос в том, как вы их находите в первую очередь? Компоновщик знает о конфликте имен, и вопрос в том, как убедить его пожаловаться? - person Bob Murphy; 24.03.2011
comment
Я пока остановился на этом. :-( - person Bob Murphy; 29.03.2011