2010-09-07 14 views
5

tengo la siguiente configuración (esperemos que esto no está demasiado al descubierto un ejemplo):referencia indefinida cuando se utiliza extern

Ah

typedef std::map<unsigned int, float> MyClass; 
extern MyClass inst; 

a.cpp

MyClass inst; 

Bh

#include <A.h> 
void foo(); 

B.cpp

#include <B.h> 
void foo { 
    inst.myClassFunc(); 
} 

Ahora, cuando uso inst en B.cpp me sale undefined reference to inst.

¿Alguna idea sobre cómo solucionar esto?

+0

¿Incluye # la definición de 'clase MyClass' en B.cpp? –

+0

Debe incluir el mensaje de error completo del compilador en su publicación. –

Respuesta

0

Este es un ejemplo muy escueto para ver qué está pasando. Sin embargo, en base a lo anterior, es muy posible que cuando llegue a la línea que falla, el compilador no tenga conocimiento de lo que realmente está en MyClass y, por lo tanto, no puede resolver MyClassFunc.

Tendríamos que ver la definición de MyClass y saber dónde está para responder con seguridad.

+0

actualizado con respecto a 'MyClass' –

0

es necesario compilar el archivo mencionado anteriormente a.cpp como

g++ -c A.cpp 
g++ -c B.cpp 

y luego al crear el ejecutable que debe escribir el comando de la siguiente manera:

g++ A.o B.o 
+1

O en un solo paso,' g ++ A.cpp B.cpp'. –

0

Desde el código básico ejemplo, usted publicado Yo diría que se olvidó de #include <B.h> en su archivo B.cpp.

9

Sé que esta pregunta es antigua, pero todavía podría ser útil para alguien.

La variable global (aquí: MyClass inst) no debería serexternpara la unidad de compilación que definen que (aquí: A.cpp)

Una forma de lograr esto:

  • declarar su variable global en un encabezado separado (digamos global.h) e incluya este encabezado en el * cpp utilizando el se.
  • quitar la palabra clave extern para la unidad de compilación que definen ellos (por ejemplo, con #ifdef):

global.h parece:

#ifdef A_H_ 
    #define EXTERN 
#else 
    #define EXTERN extern 
#endif 

EXTERN MyClass inst; 

mientras que A.h se parece a:

#ifndef A_H_ 
#define A_H_ 

// your header content (without globals) 

#endif /* A_H_ */ 

y a.cpp:

#include "A.h" 
#include "global.h" // after A.h inclusion, we need A_H_ definition 

espero que ayude!