Programación básica con GCC

Started by Drumpi, May 21, 2010, 05:31:57 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

:) Hoy vengo con muy buenos ánimos, feliz y contento para deciros que me apetecería arrancarle la cabeza a alguien de una patada, sacarle los higadillos con un tenedor y metérselos en la boca, practicarle la circuncisión con un cortauñas a la altura de los pendientes reales y arrancarle el corazón al más puro estilo Mortal Kombat :)

Pero como no tiene nada de eso la Beagle, me conformaré con maldecir a los unos y ceros :D

Nada, que estoy intentando compilar un "hola mundo" usando las toolchains de codesourcery con eclipse, pero no hay manera. Así que para poder ir presentando algo quiero compilar el siguiente código directamente con el GCC:

#include < iostream>
#include < stdlib.h>
#include < time.h>

//using namespace std;

int puntuacion ( int cuenta, int puntitos)
{
puntitos=puntitos-cuenta;
return puntitos;
}

int main()
{
float numero;
int num_acertar,contador,puntos,a;
contador=-1;
puntos=25;
srand(time(0));
num_acertar=rand()%51-25;
cout<<"******************************"<<endl;
cout<<"*                            *"<<endl;
cout<<"*      EL BUSCA-NUMEROS      *"<<endl;
cout<<"*                            *"<<endl;
cout<<"******************************"<<endl;
do{
   cout<<"    Por favor escribe un numero: ";
   cin>>numero;
   /* comprobamos que el numero esta fuera de rango de juego */
   while ((numero > 25) || (numero < -25)){
      if (numero > 25){
         cout<<"Te has pasado, el maximo es 25: ";
      } else {
               cout<<"Te has pasado, el minimo es -25: ";
      }
      cin>>numero;
      contador=contador+1;
   }
   /* compara el numero del jugador y el aleatorio */
   if (num_acertar > numero){
      cout<<"El numero es mayor";
   }else if (num_acertar < numero){
         cout<<"El numero es menor";
   }
   contador=contador+1;
       
} while(num_acertar!=numero);
cout<<"HAS ACERTADO    "<<endl;
a=puntuacion (contador,puntos);
if (a < 1){
   cout<<"Que mal@ eres, no has conseguido ni un misero numero"<<endl;
}else{
      cout<<"Has conseguido "<< a <<" puntos";
      if ((a > 0) && (a < 11)){
         cout<<", eres un/a jugador/a mediocre";
      }else if ((a > 10) && (a < 21)){
            cout<<", no esta mal pero se puede mejorar";
      }else if ((a > 20) && (a < 25)){
            cout<<", eres un/a jugador/a ejemplar";
      }else{
            cout<<", ¡¡¡¡QUE CHORRA TIENES!!!!";
      }
      cout<<endl;
}
     system("PAUSE");
     return 0;
}


El problema es que cuando invoco al GCC como: arm-none-linux-gnueabi-gcc ACIERTA1.CPP -o acierta (al instalar las toolchains, se me han añadido los ejecutables al PATH), pues me ha soltado un:

QuoteACIERTA1.CPP: In function 'int main()':
ACIERTA1.CPP:21: error: 'cout' was not declared in this scope
ACIERTA1.CPP:21: error: 'endl' was not declared in this scope
ACIERTA1.CPP:28: error: 'cin' was not declared in this scope

No perdí la calma y le pregunté al que no se si llamar amigo o enemigo, porque unas veces me contesta, otras se calla y el 70% de las veces da demasiada información, gugle. Me dijo que debía añadir la línea "using namespace std" (comentada en el código, porque en el original, con dev-c++ no se me quejó nunca), así que al hacerle caso, mi PC me largó esto:

QuoteE:\DOCUME~1\Invitado\LOCALS~1\Temp\ccEl4nuT.o: In function `__static_initializat
ion_and_destruction_0(int, int)':
ACIERTA1.CPP:(.text+0x6c): undefined reference to `std::ios_base::Init::Init()'
ACIERTA1.CPP:(.text+0x94): undefined reference to `std::ios_base::Init::~Init()'

E:\DOCUME~1\Invitado\LOCALS~1\Temp\ccEl4nuT.o: In function `main':
ACIERTA1.CPP:(.text+0x140): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x150): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x15c): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x16c): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x178): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x188): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x194): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x1a4): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x1b0): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x1c0): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x1cc): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x1dc): undefined reference to `std::istream::operator>>(flo
at&)'
ACIERTA1.CPP:(.text+0x208): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x218): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x228): undefined reference to `std::istream::operator>>(flo
at&)'
ACIERTA1.CPP:(.text+0x2a0): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x2d8): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x318): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x328): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x354): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x364): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x374): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x384): undefined reference to `std::ostream::operator<<(int
)'
ACIERTA1.CPP:(.text+0x394): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x3b8): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x3e0): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x408): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x418): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostr
eam<char, std::char_traits<char> >&, char const*)'
ACIERTA1.CPP:(.text+0x424): undefined reference to `std::ostream::operator<<(std
::ostream& (*)(std::ostream&))'
ACIERTA1.CPP:(.text+0x444): undefined reference to `std::cout'
ACIERTA1.CPP:(.text+0x44c): undefined reference to `std::basic_ostream<char, std
::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostre
am<char, std::char_traits<char> >&)'
ACIERTA1.CPP:(.text+0x45c): undefined reference to `std::cin'
collect2: ld returned 1 exit status

Y aquí ya no se si soy yo, el linker que es más malo que un Vista en un 386, o yo que sé.
A ver si me podeis echar una manita, por favor, antes de que acabe matando a alguien.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

por que no usas C comun, por que todos se empecinan ni bien empiezan a usar CPP? :P

por otro lado, si no me equivoco para compilar cpp necesitas el g++.

hace un .c de machos y deja la mariconada de los .cpp para otros.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

CPP = usar C++ = C + una serie de utilidades nuevas que si quieres las usas y si no no.
Me recuerda a algo que me dijo alguien sobre un lenguaje nuevo basado en uno anterior que empezaba por F y acababa en ENIX :D :D :D

Jejeje, qué le voy a hacer, esta fue mi segunda práctica del laboratorio de programación de mi carrera :')

De todas maneras, creo que el GCC ya invoca al G++, y despues al linker (LN) y al resto de herramientas. Se suponer que el G++ crea un a.out, que después debe ser linkado con las librerías y... bueno, no se, no tengo ni idea de qué o para qué se usa el linker.
Una vez lo usé porque tenía un par de códigos en ASM que compilé por separado, pero que al estar relacionados, debían unirse, pero esto es C... bueno, C++, que a este nivel es lo mismo.
Estaría bien encontrar a alguien que me lo explicase de una vez, porque no encuentro ni una sóla página que hable del tema, sólo de los parámetros de uno u otro.

Además, tengo otras que luego tiran de funciones de C++ (por ejemplo, NEW) y debo ser capaz de poder con ambos.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

#3
una prueba vale mas que mil palabras...

Quote
splinter@splinter:~/tmp$ cat hello.cpp
#include <iostream>

using namespace std;

int main( int argc, char *argv[])
{

cout << "hello";

}

splinter@splinter:~/tmp$ gcc hello.cpp -o hello
/tmp/ccWLsFhD.o: In function `main':
hello.cpp:(.text+0x14): undefined reference to `std::cout'
hello.cpp:(.text+0x19): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/ccWLsFhD.o: In function `__static_initialization_and_destruction_0(int, int)':
hello.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()'
hello.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()'
/tmp/ccWLsFhD.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
splinter@splinter:~/tmp$ g++ hello.cpp -o hello
splinter@splinter:~/tmp$ ./hello
hellosplinter@splinter:~/tmp$

quedamos en "g++" ?

;)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Bueno, pues dos cosas al respecto:
1- Es lo que tiene hacer mil pruebas, que se te olvida el código original ^^U El primer include debería hacer referencia a iostream.h, no a iostream a secas. Lo que pasa es que no lo encuentra (y creo que yo tampoco ^^U).
2- He hecho la prueba con G++, y al irlo a ejecutar me ha pedido una librería muy rara, sólo recuerdo que al final decía algo así como ?????????cpp.so.6 Concretamente la linea era algo como:
arm-none-linux-gnueabi-g++ ACIERTA1.CPP -o acierta
No se si se me olvida algo. Mañana si quieres te digo la lib que me pide, pero era muy rara. Y no, aqui no me vale el empezar a copiar ficheros de un lado a otro. También probaré a compilar el mismo código en la placa, a ver si también se queja, pero el objetivo es no depender de ella para programar.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

drumpi, en c++ no en todos los casos se ponen los .h, es mas, no se si es requerido.

el codigo que te puse, funciona! perfectamente!

mira, las lineas de codigo, LEE PLEASE!!! pasos:

- te mostre el codigo (cat)
- compile con C (gcc) (dio errores)
- compile con CPP (g++) (compilo perfecto)
- lo ejecute
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Rein (K´)ah Al-Ghul

Quote from: SplinterGU on May 22, 2010, 03:53:32 AM
drumpi, en c++ no en todos los casos se ponen los .h, es mas, no se si es requerido.

el codigo que te puse, funciona! perfectamente!

mira, las lineas de codigo, LEE PLEASE!!! pasos:

- te mostre el codigo (cat)
- compile con C (gcc) (dio errores)
- compile con CPP (g++) (compilo perfecto)
- lo ejecute


es como dice splinter "iostream" es una libreria de c++, por lo que debe usarse g++

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Drumpi

Bueno, cuando programaba en C++ me dijeron que esas librerías sí eran necesarias, en este caso contiene las funciones cin, cout y endl, imprescindibles para el programa. Y tenían extensión .h, y he leido que no es lo mismo iostream.h que iostream.

Y, Splinter, sí que te he leido, pero cuando tu dices:
splinter@splinter:~/tmp$ ./hello
hellosplinter@splinter:~/tmp$


A mí me sale:
./acierta: /usr/lib/libstdc++.so.6: version `CXXABI_ARM_1.3.3' not found (requir
ed by ./acierta)


Y por cierto, si tegno que usar g++ ¿qué hago cuando encima tenga otras librerías llamadas "teleco.cpp" y "teleco.hpp"? porque creo que también debería compilarlas aparte y linkarlas con LN y todo eso, cosa que, según he creido entender, es lo que hace la instrucción GCC de forma automática.
Al final tendré que hacer makefiles y todo :(
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

no, lo que digo es que me parece que no es necesario es poner ".h". No soy experto en C++ todo de oido y entiendo el codigo.

ja! yo lo compile y ejecute en pc, obviamente no podes hacer lo mismo, tenes que ejecutarlo en el ARM. y si te da ese error es porque no tenes esa lib o el cross es de otra version.

no, g++ lo linkea automaticamente, fijate el ejemplo que puse.

Sinceramente (por favor no te lo tomes a mal) te recomiendo buscar algun "tutorial" de compilacion gcc, g++, makefiles. Te hace falta una buena base al respecto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No me lo tomo a mal, es que lo se, pero por alguna razón no encuentro ninguno... bueno, encontraba, he vuelto a buscar y ¡milagro! he pillado unos cuantos, a ver si así me entero mejor, porque los PDF que acompañan al GCC de codesourcery, mucha explicación de las opciones pero no exponen ejemplos de uso ni nada de información.

Tambien creo que tendré que buscar un manual para instalar y configurar minsys para trabajar con estas toolchains y eclipse, porque no consigo que este último se entienda con gcc, pese a que está en el PATH (aunque claro, con nombres como arm-none-linux-gnueabi-gcc.exe :S).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

kim-elet-o

Hola drumpi, yo este año estoy estudiando FP ciclo superior de DAI, y en el credito de programacion modular y estructurada (programacion para profanos), "hemos" aprendido a programar con c/c++ (digo "hemos" por que yo ya sabia programar antes de empezar el ciclo  ;D ;D ;D ;D :D :D :D :D), usamos como IDE el netbeans, aunque es un poco "pesada" y al cargar es lenta, es muy versatil y tiene un monton de herramientas utiles, si te esta costando horrores compilar y linkar a pelo, quizas te vaya bien...
|/
|\im-elet-o el yayo programador.

Drumpi

Por desgracia, no puedo usar otras herramientas que las que me han sugerido: openembedded para compilar el kernel, eclipse para programar para el OMAP y la utilidad comercial (en plan shareware) de TI para el DSP (porque la universidad tiene una licencia para dicho soft, porque he visto que hay un SDK libre).

Pero lo que me extraña es que no pueda compilar un código tan simple como el del primer mensaje. El hola mundo ha funcionado porque no necesitaba librerías, pero este... :S
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Drumpi

Vale, ahora sí que sí, voy a matar a Moeeee.... wiiiiii.
¿Os acordais del error de que no encontraba la libstdc++? después de un par de días buscando tutoriales, blogs, foros y ayudas, me da por mirar el sitio donde descargué las toolchains. Hay un apartado con un enlace a un manual "getting started" y me lo he estado leyendo desde el principio.
En un apartado sobre cómo hacer funcionar los programas, dice una cosa parecida a "para poder ejecutar tu programa, deberás instalar una serie de archivos en tu sistema", tócate las webs.

Encima hay tres formas de usarlo, porque la más normal, copiar a la carpeta del sistema, puede sobreescribir las existentes y provocar que no arranque, así que hay que hacer el linkado en tiempo de compilación (añadiendo la ruta a la librería) o en tiempo de ejecución (invocando el ejecutable como un parámetro al llamar al linker... y añadiendo la ruta a la librería).

O sea, que yo uso unas librerías estandar, pero como las toolchains son suyas, debo usar sus librerías o me dan por...

Bueno, al final he compilado el espectacular juego de "adivina un número", y gracias a dios funciona a través del puerto serie (que si no, tenía que irme a hacer las pruebas a la tele del salón, y rezar para que la ventanita de login se quitase).
Ahora me toca el siguiente paso, que es otro juego que pasará a la historia: la versión "sólo texto" de "el juego de la oca". Me está fastidiando la conio.h ¿es cierto que no existe en Linux? uso bastantes funciones suyas.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

y yo que te habia dicho? ;)

me alegro que lo hayas resuelto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2