2011-05-06 19 views
10

Comencé a escribir una clase muy simple, y todos los tipos de métodos de clase parecen darme problemas. Espero que el problema sea yo y la solución es simple.Problema de compilación en C++; class methods

El comando g ++ -o main.cpp principal da la salida folowing:

/usr/bin/ld: Undefined symbols: 
Lexer::ConsoleWriteTokens() 
collect2: ld returned 1 exit status 

main.cpp:

#include<iostream> 
#include"lexer.h" 


int main(){ 

    Lexer lexhnd = Lexer(); 
    std::cout << "RAWR\n"; 
    lexhnd.ConsoleWriteTokens(); 
    std::cout << "\n\n"; 

return 0; 
} 

lexer.h:

#ifndef __SCRIPTLEXER 
#define __SCRIPTLEXER 

#include <iostream> 
#include <string> 
#include <vector> 

#define DEF_TOKEN_KEYWORD 0 

struct token{ 
int flag; 
std::string data; 
}; 

class Lexer 
{ 
public: 
// bool IsTrue(); 
// bool AddLine(char * line); 
    void ConsoleWriteTokens(void); 

private: 
std::vector<token> TOK_list; 

}; 


#endif 

lexer.cpp :

bool Lexer::IsTrue(){ 
return true; 
}; 


bool Lexer::AddLine(char * line){ 

token cool; 
cool.data = line; 

TOK_list.push_back(cool); 
string = line; 
return true; 
}; 

void Lexer::ConsoleWriteTokens(void){ 

for (int i = 0; i < TOK_list.size(); i++){ 
    std::cout << "TOKEN! " << i; 
} 

return 0; 
}; 

Estoy usando g ++ en xcode por cierto.

Gracias de antemano, he estado en este problema por unas horas.

EDIT:

g++ -o main lexer.h main.cpp 
or 
g++ -o main lexer.cpp main.cpp 
or 
g++ -o main main.cpp lexer.cpp 

tampoco funcionan. -Hyperzap

+2

+1 para incluir el error, el comando que utilizó para compilar y un ejemplo mínimo. Una muy buena pregunta. – Tom

+1

Creo que debes aprender a escribir Makefiles o usar automake/autoconf o cmake o qmake o usar un IDE que hará todo eso por ti. –

Respuesta

6

No está compilando el código lexer.cpp.

Trate

g++ -o main main.cpp lexer.cpp 

como su comando de compilación.

PROBLEMAS EN LA lexer.cpp

Es posible que desee incluir la cabecera lexer en el archivo lexer.cpp

#include "lexer.h" 

Además, no quieren devolver un número entero de vacío funciones.

void Lexer::ConsoleWriteTokens(void){ 
    for (int i = 0; i < TOK_list.size(); i++){ 
    std::cout << "TOKEN! " << i; 
    } 
    //This function is void - it shouldn't return something 
    //return 0; 
}; 

Por último, usted tiene algunos problemas withs esta función

bool Lexer::AddLine(char * line){ 

    token cool; 
    cool.data = line; 

    TOK_list.push_back(cool); 
    //what is this next line trying to achieve? 
    //string = line; 
    return true; 
}; 

No estoy seguro de lo que está tratando de lograr con la línea de lo comenté a cabo, no parece hacer nada y string no está definido (¿quisiste decir std::string mystring = line;)

Por último, no olvides descomentar las funciones declaradas en lexer.h que estás definiendo en lexer.cpp.

+0

no, todavía no funciona. –

+0

nvm, ahora funciona. Gracias. –

+0

también, cuando compila múltiples .cpp en la línea de comandos como lo ha mostrado, está 'compilando' el código y luego uniéndolos, o tiene que vincular lexer.cpp a main.cpp usando #include "lexer .h "en main.cpp ??? –

2

incluir todos los archivos .cpp en la línea de comandos, así:

g++ -o main main.cpp lexer.cpp 

Cuando el proyecto crece, se hace aconsejable gestionar su proyecto de alguna manera automática: Makefile, hormiga, o algún IDE- archivo de proyecto integrado.

+0

Aún no funciona. Recibo un millón de errores. –

+1

Debe incluir 'lexer.h' de' lexer.cpp'. El compilador comenzará de nuevo con cada archivo fuente, cada archivo fuente debe incluir los archivos de encabezado que necesita. – Lindydancer

+0

gracias excelentes. Es gracioso que, pensé que era al revés, donde "encadenas" todas tus secuencias de comandos usando #include., en lugar de compilar por separado y vincular. Sin mencionar que olvidé volver a poner el #include después de eliminarlo en la angustia de la experimentación. –

1

Bueno g++ -o main main.cpp lexer.cpp sould hacer el truco. Sin embargo, sugiero hacer archivos makefile. Al tener una cantidad múltiple de archivos, son útiles. También sugeriría agregar algo de optimización a su compilación como -O3 o -O2 (¡O es una letra o no de cero dígitos!). La diferencia en la velocidad de ejecución es muy notable. Además, si está buscando hacer librerías de sus archivos, ¿por qué no usar la opción --shared que creará una biblioteca de su agrado? Encuentro que hacer bibliotecas compartidas es muy útil.

+0

+1 Sí, definitivamente deberías usar scripts para ayudarte a construir tus archivos. Intentaré aprender cmake desde el principio: su plataforma cruzada, y funcionará tanto en Linux como en Windows. autotools es una herramienta de linux (muy común) solamente. – Tom