Comunidad PHPeros

Lenguajes => C / C++ => Mensaje iniciado por: Warlox en 11 de Enero de 2011, 07:00:16 am

Título: Error en system() de linux
Publicado por: Warlox en 11 de Enero de 2011, 07:00:16 am
¡Hola!

Bueno, el día de hoy estaba creando una aplicación en C++, la cual me abre la bandeja del CD. Lo que pasa es que al compilarla no me funciona, y me da un error algo raro, bueno acá está el código:

Código: [Seleccionar]
#include <stdlib.h>
#include <iostream>

int main()
{
system("eject");
}

Y el error que me da es el siguiente:

Citar
/tmp/ccn1Zr7O.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

¿Alguien me puede ayudar a solucionarlo, o explicarme a qué se debe?
Gracias de antemano ^^
Título: Re:Error en system() de linux
Publicado por: javipilo en 11 de Enero de 2011, 16:45:04 pm
Tienes que coger la api de linux para poder hacer eso, googlea un poquito.

Saludos
Título: Re:Error en system() de linux
Publicado por: Warlox en 11 de Enero de 2011, 19:45:23 pm
¿Para qué necesitaría la API de Linux si estoy en Linux?
Título: Re:Error en system() de linux
Publicado por: javipilo en 12 de Enero de 2011, 00:26:17 am
No se exactamente :S, esperemos a TLX...

Saludos
Título: Re:Error en system() de linux
Publicado por: Physlet en 12 de Enero de 2011, 01:07:25 am
Según yo entiendo, system() ejecuta el comando que pongas entre comillas como si fuese MS-DOS o en tu caso, el Terminal.  ¿El comando "eject" funciona desde terminal para abrir tu CD-ROM?
Título: Re:Error en system() de linux
Publicado por: CarlosRdrz en 12 de Enero de 2011, 02:05:27 am
Según yo entiendo, system() ejecuta el comando que pongas entre comillas como si fuese MS-DOS o en tu caso, el Terminal.  ¿El comando "eject" funciona desde terminal para abrir tu CD-ROM?

Es exactamente lo que dice Physlet, system() es dependiente de la plataforma, lo que quiere decir que no funciona igual en Linux que en Windows.
En Linux tengo entendido que hay un script que te abre la bandeja del cd, que es /usr/bin/eject, osea que funcionaría con
system("/usr/bin/eject");
Pero de todas formas, eso no lo arreglará, porque aunque es necesario que lo pongas para que saque la bandeja del CD, no es lo que causa tu error.

Antes de continuar, quería comentarte de todas formas que si tu main() es de tipo int, tienes que retornar un numero, normalmente un 0, así que el main() queda como
int main() {
   system("/usr/bin/eject");
   return 0;
}

Estas lineas:
/tmp/ccn1Zr7O.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
Son siempre errores del enlazador (linker), lo que normalmente quiere decir que falta algún archivo para que pueda enlazarse todo.
Pero no uno de esos archivos de inclusión que incluyes con #include (que redundancia) sino los archivos del propio compilador. Las librerias ya compiladas.

El problema es que cuando compilas con gcc o g++ tienes que tener claro si vas a compilar código C o código C++, porque gcc tiene unas librerias y usa unos archivos diferentes a g++. Tu problema es ese, estás incluyendo la librería <iostream> que es una libreria de C++, y seguramente para compilar estés usando el comando gcc.

Dos soluciones: o quitar la libreria <iostream> (puesto que no la estas usando) o en lugar de compilar con gcc compilas con g++.

Saludos!

Título: Re:Error en system() de linux
Publicado por: Warlox en 12 de Enero de 2011, 02:38:02 am
Es exactamente lo que dice Physlet, system() es dependiente de la plataforma, lo que quiere decir que no funciona igual en Linux que en Windows.
En Linux tengo entendido que hay un script que te abre la bandeja del cd, que es /usr/bin/eject, osea que funcionaría con
system("/usr/bin/eject");
Pero de todas formas, eso no lo arreglará, porque aunque es necesario que lo pongas para que saque la bandeja del CD, no es lo que causa tu error.

Antes de continuar, quería comentarte de todas formas que si tu main() es de tipo int, tienes que retornar un numero, normalmente un 0, así que el main() queda como
int main() {
   system("/usr/bin/eject");
   return 0;
}

Estas lineas:
/tmp/ccn1Zr7O.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
Son siempre errores del enlazador (linker), lo que normalmente quiere decir que falta algún archivo para que pueda enlazarse todo.
Pero no uno de esos archivos de inclusión que incluyes con #include (que redundancia) sino los archivos del propio compilador. Las librerias ya compiladas.

El problema es que cuando compilas con gcc o g++ tienes que tener claro si vas a compilar código C o código C++, porque gcc tiene unas librerias y usa unos archivos diferentes a g++. Tu problema es ese, estás incluyendo la librería <iostream> que es una libreria de C++, y seguramente para compilar estés usando el comando gcc.

Dos soluciones: o quitar la libreria <iostream> (puesto que no la estas usando) o en lugar de compilar con gcc compilas con g++.

Saludos!

¡Efectivamente!

Bueno, creo que mi código estaba bien, en lo que fallaba era en que tenía que hacer previamente la llamada al "/usr/bin". Lo que se me ocurre es crear una función para no tener que estar todo el tiempo escribiendo el "/usr/bin", teniendo solamente que escribir el comando.

Te dejo un K+.
Saludos ^^