Понимание происхождения ошибки дублирования символа компоновщика

У меня есть программа на C ++, которая скомпилировалась ранее, но после удаления с Jamfiles программа больше не компилировалась и ld выдал ошибку дублирования символа ]. Это сохранялось после последовательного возврата к исходным Jam-файлам с запуском bjam clean , удаление объектов вручную и переключение с clang с помощью интерфейса gcc на gcc 4.2.1 в MacOs 10.6.7.

Упрощенное описание программы состоит в том, что есть main.cpp и четыре файла, ah, cpp и bh, cpp , которые скомпилированы в статическая библиотека, связанная с main.o . Оба, main.cpp и b.cpp зависят от файла, содержащего неправильный символ, off.h , через два разных промежуточных файла, но ни один ] ah и a.cpp никак не зависят от off.h .

Прежде чем вы спросите, я убедился, что все файлы были заключены в несколько защитных устройств определений ( #ifndef , #define , #endif ), и хотя я нашел файл, в котором они отсутствовали, он не ссылался на off.h . Что еще более важно, bh не включает ничего, что ссылается на off.h , только реализация b.cpp делает какие-либо ссылки на off.h . Одно это меня озадачило.

Чтобы усугубить мою путаницу, мне удалось удалить ссылку на off.h из b.cpp , и, как и ожидалось, он успешно перекомпилировался. Однако, когда я снова добавил ссылку, она также успешно скомпилировалась и продолжила делать это после очистки объектных файлов. Я все еще не понимаю, почему он не компилировался, особенно с учетом того, что символы не должны конфликтовать, я предотвратил дублирование символов и избавился от любых предыдущих / незавершенных сборок.

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

21
задан rcollyer 24 May 2011 в 20:04
поделиться