Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Bob MurphyОтветов: 1

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

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

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

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

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

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

macosxcodelinkerld

Ответы

Ответ 1 · рейтинг 3 · Bob Murphy

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы