2011-03-23 16 views
6

Aquí hay una diferente de la confusión habitual sobre los errores de símbolos duplicados ... :-)¿Cómo puedo convencer a Xcode para que emita un error de enlazador de símbolo duplicado?

Estoy trabajando en algún código Mac heredado en un proyecto Xcode que tiene el mismo global, "traza", definido en varios diferentes archivos de origen, por ejemplo:

  • File1.c: SInt32 trace;
  • File2.c: Traza booleana;

etc. Está claro que el autor original significaba que tenían un alcance específico de archivo, pero simplemente omitió prefijar cualquiera de estas líneas con "estático". Está bien, lo suficientemente fácil de arreglar.

¡Pero estoy algo sorprendido de que el enlazador no los marque! Me parece que el enlazador de Xcode (supongo que gnu ld) solo emite advertencias de símbolos duplicados o errores para las funciones, que están vinculadas al segmento de código, pero no a las variables globales que están vinculadas al segmento de datos. En cambio, los combina en silencio, lo que está causando errores.

Entonces ... ¿cómo convenzo a Xcode de emitir errores de enlace para variables globales duplicadas? ¿O obtener esta información de alguna otra manera que puede ser una parte de rutina de mi compilación?

Respuesta

2

Bueno, pensó que había respondido a mi propia pregunta ... :-)

he publicado anteriormente:

Así que si estás usando Xcode con LLVM GCC 4.2, vaya al cuadro de diálogo de configuración de compilación, busque la sección "LLVM GCC 4.2 - Código Generación" y marque la casilla "No Bloques comunes". Esto permite la opción del compilador "-fno-común", y cambia la generación del fichero objeto para que se ahogue ld y emiten un error si tiene dos variables globales en archivos de origen diferentes con el mismo nombre .

Desafortunadamente, eso no parece resolver todas las instancias. Parece funcionar bien si todos los globales tienen el mismo tipo.

Pero el ejemplo en la pregunta se toma directamente del código, donde una variable llamada "trace" se define como global en dos archivos diferentes con dos tipos diferentes. Y eso todavía no está atrapado por el sistema de compilación cuando marque esa casilla de verificación.

+0

¿Quizás una búsqueda de todo el proyecto para el artículo ofensivo, una vez que tenga una instancia? – MCannon

+0

Bueno, sí, eso es parte de la solución una vez que sepa cuál es el nombre de la variable ofensiva. La pregunta es realmente, ¿cómo los encuentras en primer lugar? El enlazador sabe que hay una colisión de nombres, y la pregunta es, ¿cómo convencerlo para quejarse? –

+0

He dado un puntapié en esto por el momento. :-( –

Cuestiones relacionadas