2012-02-14 12 views
53

Estoy escribiendo código C++ en un mac. ¿Por qué aparece este error al compilar ?:error de enlace de variable estática

Undefined symbols for architecture i386: "Log::theString", referenced from: Log::method(std::string) in libTest.a(Log.o) ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

No estoy seguro si mi código está mal o tengo que agregar indicadores adicionales a Xcode. Mis configuraciones actuales de XCode son las predeterminadas para un proyecto de 'biblioteca estática'.

Mi código:

Log.h ------------

#include <iostream> 
#include <string> 

using namespace std; 

class Log{ 
public: 
    static void method(string arg); 
private: 
    static string theString ; 
}; 

LOG.CPP ----

#include "Log.h" 
#include <ostream> 

void Log::method(string arg){ 
    theString = "hola"; 
    cout << theString << endl; 
} 

estoy llamando al 'método' desde un código de prueba, de esta manera: 'Método Log :: ("asd"):'

gracias por su ayuda.

+4

estoy de acuerdo que esta es una pregunta duplicado. La otra pregunta a la que se hace referencia es de naturaleza muy general y no me habría ayudado a resolver mi problema específico de mac. – Adam

Respuesta

65

Debe definir las estáticas en el archivo cpp.

LOG.CPP

#include "Log.h" 
#include <ostream> 

string Log::theString; // <---- define static here 

void Log::method(string arg){ 
    theString = "hola"; 
    cout << theString << endl; 
} 

También debe eliminar using namespace std; de la cabecera. Adquiera el hábito mientras pueda. Esto contaminará el espacio de nombre global con std donde quiera que incluya el encabezado.

+0

Bastante * inicializa * en lugar de * define *, no (solo pregunta)? – Vyktor

+0

@Vyktor Creo que ambos son aceptados. –

+9

Quizás incluso un término mejor sería que asigna espacio para la cadena. – btown

12

Has declarado static string theString;, pero no lo he definido.

Incluir

string Log::theString; 

a su archivo cpp

Cuestiones relacionadas