Entender el origen de un error de símbolo duplicado del vinculador

Tengo un programa de C ++ que se compiló anteriormente, pero después de jugar con Jamfiles, el programa ya no se compiló yld emitió unduplicate symbol error. Esto persistió después de volver sucesivamente a los Jamfiles originales, ejecutandobjam clean, quitando los objetos a mano y cambiando de clang con el front-end de gcc a gcc 4.2.1 en MacOs 10.6.7.

na descripción simplificada del programa es que haymain.cpp y cuatro archivos,a.h,cpp yb.h,cpp, que se compilan en una biblioteca estática que está vinculada amain.o. Ambos,main.cpp yb.cpp depende del archivo que contiene el símbolo ofensivo,off.h, a través de dos archivos intermedios diferentes, pero ningunoa.h nora.cpp depende de cualquier manera deoff.h.

Antes de preguntar, me aseguré de que todos los archivos estuvieran envueltos en múltiples protectores de definición #ifndef, #define, #endif), y aunque encontré un archivo que les faltaba, no hacía referencia aoff.h. Más importante,b.h no incluye nada que haga referencia aoff.h, solo la implementación,b.cpp, hace referencia aoff.h. Esto solo me tenía perplejo.

ara agregar a mi confusión, pude eliminar la referencia aoff.h desdeb.cpp y, como se esperaba, se compiló con éxito. Sin embargo, cuando agregué la referencia nuevamente, también se compiló con éxito y continuó haciéndolo después de limpiar los archivos de objetos. Todavía no sé por qué no se pudo compilar, especialmente teniendo en cuenta que los símbolos no deberían haber entrado en conflicto, había evitado la duplicación de símbolos y me había deshecho de cualquier compilación anterior / incompleta.

Dado que pude compilar con éxito mi programa, dudo que pueda reproducirlo para probar cualquier sugerencia. Sin embargo, tengo curiosidad por saber cómo puede suceder esto, y si me encuentro con este comportamiento en el futuro, ¿qué, si hay algo más allá de lo que he hecho, podría hacer para solucionarlo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta