У меня есть программа на 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
, и, как и ожидалось, он успешно перекомпилировался. Однако, когда я снова добавил ссылку, она также успешно скомпилировалась и продолжила делать это после очистки объектных файлов. Я все еще не понимаю, почему он не компилировался, особенно с учетом того, что символы не должны конфликтовать, я предотвратил дублирование символов и избавился от любых предыдущих / незавершенных сборок.
Поскольку мне удалось успешно скомпилировать свою программу, я сомневаюсь, что смогу воспроизвести ее, чтобы проверить любые предложения. Однако мне любопытно, как это может произойти, и если я столкнусь с таким поведением в будущем, что, если что-то помимо того, что я сделал, я могу сделать, чтобы исправить это?