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?