Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] El compilador me habla en chino

Estas en el tema de El compilador me habla en chino en el foro de C/C++ en Foros del Web. Buenas! con este titulo tan simpático presento mi problema que me tiene loco hace unos dias. Resulta que hace rato que no programo en C++ ...
  #1 (permalink)  
Antiguo 25/12/2013, 17:28
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 4 meses
Puntos: 0
Exclamación El compilador me habla en chino

Buenas! con este titulo tan simpático presento mi problema que me tiene loco hace unos dias. Resulta que hace rato que no programo en C++ y más en linux, asi q decidí volver al ruedo con una clase Racionales.

Racional.cpp, Racional.hpp, mainRacionales.cpp (dnd puse un main y algunas pruebas)
En Racional estan las funciones de toda la vida (unos constructores, operator+, operator+=, etc)
Lo más dificil que tiene es operator<<

Cuando voy a compilar mainRacionales.cpp me dice q las referencias a Racional no están. Con lo cual entiendo que no esta pudiendo compilar Racional.cpp
Entonces compilo Racional.cpp y me sale lo siguiente:

Ejecuto
"g++ -o Raci Racional.cpp"
Código:
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 0 tiene un índice de símbolo 11 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 1 tiene un índice de símbolo 12 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 2 tiene un índice de símbolo 2 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 3 tiene un índice de símbolo 2 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 4 tiene un índice de símbolo 11 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 5 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 6 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 7 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 8 tiene un índice de símbolo 12 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 9 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 10 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 11 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 12 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 13 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 14 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 15 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 16 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 17 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 18 tiene un índice de símbolo 13 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): la reubicación 19 tiene un índice de símbolo 21 inválido
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): la reubicación 0 tiene un índice de símbolo 2 inválido
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: En la función `_start':
(.text+0x20): referencia a `main' sin definir
collect2: error: ld returned 1 exit status

No pude encontrar en ningún lado que significa: "la reubicación % tiene un índice de símbolo % inválido",

Alguien tiene alguna minima idea de que pasa? Puede ser que este usando mal el compilador, o algo muy tonto. O que el compilador me odie.

Sigo: probe tmb con el gcc, y pasa lo mismo. Probe dejando y sacando el namespace std y los #include de Racional.h y es lo mismo. Tambien cambiando .hpp por .h xD
Incluso solamente deje en la clase el constructor y un Racional::display() y pasa lo mismo.

Código:
/**
Racional.cpp
*/
#include <iostream>
#include <cmath>
#include "Racional.hpp"

using namespace std;


Racional::Racional()
{
    Num = 0;
    Den = 1;
}

Racional::Racional(long numerador, long denominador)
{
    Num = numerador;
    Den = denominador;
    normalizar(*this);
}

Racional::Racional(const Racional &copia)
{
	Num = copia.Num;
	Den = copia.Den;
	//copia ya esta normalizada, asi q no necesito repetir la operacion.
}

/**
mainRacional.cpp
*/

#include <iostream>
#include "Racional.hpp"

using namespace std;

int main()
{
	Racional a(4,5);
	Racional b(9,3);
	Racional c;
	cout << "4/5 = ";
	a.display();
        return 0;
}
  #2 (permalink)  
Antiguo 25/12/2013, 21:33
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: El compilador me habla en chino

sube racional.hpp
  #3 (permalink)  
Antiguo 26/12/2013, 06:18
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: El compilador me habla en chino

El .hpp no tiene nada de particular. Ya lo modifique tantas veces que te podria pasar mil versiones y en ningun caso anda (con/sin #include, con/sin namespace, etc). Bueno, tal vez no estoy viendo algo del .h? Aca lo dejo

Código:
/**
Racional.hpp
*/

#ifndef __RACIONAL__
#define __RACIONAL__

using namespace std;

class Racional
{
public:
    Racional();
    Racional(long numerador, long denominador);
    Racional(const Racional& copia);
    void display();
    
    void normalizar(Racional a);
    
private:
	
    long Num;
    long Den;
};

#endif
Aclaro que Racional::normalizar(Racional) sí esta implementado aunq me olvide de ponerlo en el anterior post. Es la normalizacion de toda la vida, con unas multiplicaciones y sumas. Lo mismo Racional::display() que es cout << Num << '/' << Den;

PD: no encuentro para editar mi anterior post. Existe esa opcion en este foro?? No la encuentro :/

Última edición por Pernoctador; 26/12/2013 a las 06:39
  #4 (permalink)  
Antiguo 26/12/2013, 09:14
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: El compilador me habla en chino

#include <iostream>
using namespace std;
class Racional
{
public:
Racional();
Racional(long numerador, long denominador);
Racional(const Racional& copia);
void display(){ cout << Num << '/' << Den; };

void normalizar(Racional a);

private:

long Num;
long Den;
};


Racional::Racional()
{
Num = 0;
Den = 1;
}

Racional::Racional(long numerador, long denominador)
{
Num = numerador;
Den = denominador;
//normalizar(*this);//FALTA IMPLEMENTAR ¿¿Que hace??
}

Racional::Racional(const Racional &copia)
{
Num = copia.Num;
Den = copia.Den;
//copia ya esta normalizada, asi q no necesito repetir la operacion.
}

int main()
{
Racional a(4,5);
Racional b(9,3);
Racional c;
cout << "4/5 = ";
a.display();
return 0;
}

No veo nada malo aparte de lo que comentas sobre que falta implementar a "normalizar()"
a mi no me tira errores.
Implementa en este archivo que tiene todo junto y después le partes en trozos como te guste :D

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3. class Racional
  4. {
  5. public:
  6.     Racional();
  7.     Racional(long numerador, long denominador);
  8.     Racional(const Racional& copia);
  9.     void display(){ cout << Num << '/' << Den; };
  10.    
  11.     void normalizar(Racional a);
  12.    
  13. private:
  14.    
  15.     long Num;
  16.     long Den;
  17. };
  18.  
  19.  
  20. Racional::Racional()
  21. {
  22.     Num = 0;
  23.     Den = 1;
  24. }
  25.  
  26. Racional::Racional(long numerador, long denominador)
  27. {
  28.     Num = numerador;
  29.     Den = denominador;
  30.     //normalizar(*this);//FALTA IMPLEMENTAR
  31. }
  32.  
  33. Racional::Racional(const Racional &copia)
  34. {
  35.     Num = copia.Num;
  36.     Den = copia.Den;
  37.     //copia ya esta normalizada, asi q no necesito repetir la operacion.
  38. }
  39.  
  40. int main()
  41. {
  42.     Racional a(4,5);
  43.     Racional b(9,3);
  44.     Racional c;
  45.     cout << "4/5 = ";
  46.     a.display();
  47.         return 0;
  48. }
  #5 (permalink)  
Antiguo 26/12/2013, 21:49
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: El compilador me habla en chino

Hola,

Posiblemente,

Cita:
Iniciado por Pernoctador Ver Mensaje
... Cuando voy a compilar mainRacionales.cpp me dice q las referencias a Racional no están. Con lo cual entiendo que no esta pudiendo compilar Racional.cpp ...
Para compilar se tiene que incluir todos los archivos que estén relacionados,

Código:
g++ -o Raci mainRacional.cpp Racional.cpp Racional.hpp
Cita:
Iniciado por Pernoctador Ver Mensaje
Ejecuto
"g++ -o Raci Racional.cpp"
Código:
(.text+0x20): referencia a `main' sin definir
collect2: error: ld returned 1 exit status
Alguien tiene alguna minima idea de que pasa? Puede ser que este usando mal el compilador, o algo muy tonto. O que el compilador me odie.
En ese caso, que estás intentando compilar solamente el archivo Racional.cpp, el problema no está en el Compilador, está en el Linker. Te está diciendo que la unidad de compilación Racional.cpp no tiene main(). Al parecer el código compila correctamente (pero no linkea por ese motivo). El método para compilar todo el proyecto es incluir todos los archivos, incluyendo el archivo que tiene el main.

Saludos,

Última edición por HackmanC; 26/12/2013 a las 21:58 Razón: extender la explicacion
  #6 (permalink)  
Antiguo 27/12/2013, 06:27
 
Fecha de Ingreso: noviembre-2008
Mensajes: 12
Antigüedad: 15 años, 4 meses
Puntos: 0
Sonrisa Respuesta: El compilador me habla en chino

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

Posiblemente,



Para compilar se tiene que incluir todos los archivos que estén relacionados,

Código:
g++ -o Raci mainRacional.cpp Racional.cpp Racional.hpp


En ese caso, que estás intentando compilar solamente el archivo Racional.cpp, el problema no está en el Compilador, está en el Linker. Te está diciendo que la unidad de compilación Racional.cpp no tiene main(). Al parecer el código compila correctamente (pero no linkea por ese motivo). El método para compilar todo el proyecto es incluir todos los archivos, incluyendo el archivo que tiene el main.

Saludos,
Genio! Hacia tanto que no compilaba en consola que me habia olvidado de esa obviedad :P
Gracias! :)

Etiquetas: c++, compilador, gcc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:18.