Как я могу убедить Xcode выдать ошибку компоновщика дубликатов символов? - PullRequest
6 голосов
/ 23 марта 2011

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

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

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

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

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

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

1 Ответ

2 голосов
/ 24 марта 2011

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

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

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

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

...