Entendendo a origem de um erro de símbolo duplicado do vinculador

Eu tenho um programa c ++ que compilou anteriormente, mas depois de mexer com os Jamfiles, o programa não é mais compilado eld emitiu umduplicate symbol error. Isso persistiu depois de reverter sucessivamente para os Jamfiles originais, executandobjam clean, remover os objetos manualmente e mudar do clang com o front end do gcc para o gcc 4.2.1 nos MacOs 10.6.

Uma descrição simplificada do programa é que existemain.cpp e quatro arquivos,a.h,cpp eb.h,cpp, compilados em uma biblioteca estática vinculada amain.o. Ambos,main.cpp eb.cpp depende do arquivo que contém o símbolo incorreto,off.h, através de dois arquivos intermediários diferentes, mas nenhuma.h nema.cpp depende de qualquer forma deoff.h.

Antes de você perguntar, certifiquei-me de que todos os arquivos fossem agrupados em guardas de definição múltipla #ifndef, #define, #endif), e embora eu tenha encontrado um arquivo que estava faltando, ele não fez referência aoff.h. Mais importante,b.h não inclui nada que faça referência aoff.h, apenas a implementação,b.cpp, faz qualquer referência aoff.h. Só isso me deixou intrigad

Para aumentar minha confusão, pude remover a referência aoff.h a partir deb.cpp e, como esperado, recompilou com sucesso. No entanto, quando adicionei a referência novamente, ela também foi compilada com êxito e continuou a fazê-lo após a limpeza dos arquivos do objeto. Ainda estou sem entender por que não foi possível compilar, especialmente considerando que os símbolos não deveriam ter entrado em conflito, evitei a duplicação de símbolos e me livrei de construções anteriores / incompleta

Desde que consegui compilar com sucesso o meu programa, duvido que seja capaz de reproduzi-lo para testar quaisquer sugestões. No entanto, estou curioso para saber como isso pode acontecer e, se me deparar com esse comportamento no futuro, o que, se algo além do que fiz, devo fazer para corrigi-lo?

questionAnswers(1)

yourAnswerToTheQuestion