Iniciar sesión

Ver la versión completa : Ayuda con Eclipse



turco
30/01/2008, 21:38
Bueno, antes de nada un saludo a todos, este mi primer post. :lovegp2x:

Acabo de comprar una GP2X F200 y quiero ponerme a hacer cositas con SDL en C para ir cogiendo práctica con el compilador y las librerías.

El caso es que estoy intentando hacer un pequeño programa que controle a un personaje de un videojuego. La cosa es que estoy acostumbrado a programar en Java con Eclipse y me parece muy buen IDE (al menos para Java), y ahora quería seguir con él para compilar en C.

Cuando sólo manejo un fichero todo va sobre ruedas. Pero ahora he incluido otro fichero que sólo tiene una función, y a la hora de compilar me lanza el siguiente mensaje de error:


Building target: actor-linux
Invoking: GCC C Linker
gcc -o"actor-linux" ./actor.o ./macros.o ./main.o -lSDL -lpthread
./main.o: In function `initActor':
main.c:(.text+0x0): definiciones múltiples de `initActor'
./actor.o:actor.c:(.text+0x0): primero se definió aquí
collect2: ld returned 1 exit status
make: *** [actor-linux] Error 1

El fichero donde está el #include es "main.c" y el que parece dar problemas es el "actor.c". Hay un tercer fichero que como sólo contiene macros y no parece afectar (macros.c).

Bueno, pues a ver si alguien puede ayudarme.
Gracias.

WinterN
31/01/2008, 00:03
Parece que initActor() lo tienes definido en más de un fichero.

turco
31/01/2008, 18:17
Es que eso es lo extraño. initActor() únicamente está definido en el fichero actor.c. Supongo que será algo relacionado con la forma en que compila y linka eclipse.

¿Con qué parámetros compilais vosotros normalmente?

Y otra pregunta más :confused:: ¿Alguien utiliza linux para programar y, si es así, que herramientas usais?

Perdonad tantas preguntas pero es que aun soy muy novato :loco:.
Gracias

neglox
31/01/2008, 18:28
Supongo que los ficheros se llaman asi pero prueba a ver si asi te compila bien.
gcc -o"actor-linux" actor.c ./macros.c ./main.c -lSDL -lpthread

< - >
Ahora que lo pienso, si tienes alg&#250;n include pones al principio de &#233;l algo en plan?

#ifndef actor_h
#define actor_h
[...]
#endif

turco
31/01/2008, 18:48
Probar&#233; ese comando en cuanto llegue a mi casa :rolleyes:. El que s&#237; s&#233; que me funciona es este:
gcc -lSDL -lpthread main.c -o actor-linux

El bloque '#ifndef/#define/#endif' ya lo uso :(, pero no parece afectar mucho.

juanvvc
31/01/2008, 19:07
turco, el bloque #ifndef es fundamental en C para evitar lo que te est&#225; pasando. Rev&#237;salo porque muy probablemente &#233;se sea el problema. Por otro lado, si pones por aqu&#237; el fuente te podremos ayudar m&#225;s. Aunque borres el contenido de las funciones para que no lo veamos :)

Desarrollar en Linux. &#191;Acaso se puede desarrollar en otras plataformas? Ah, s&#237;, en MAC :D Yo uso Kdevelop pero compilando en consola con un Makefile. De hecho, ahora que pienso la mayor parte de las veces paso del KDevelop y utilizo Kate o Vim :)

forofo
31/01/2008, 21:44
Mi respuesta est&#225; en sinton&#237;a con lo que te comentana el resto de usuarios. Crea un archivo actor.h (si no lo has creado ya) y entre los :

#ifndef actor_h
#define actor_h
[...]
#endif

Que te deber&#237;a de generar automatiamente el eclipse, incluye el nombre de la funci&#243;n que quieras utilizar en el main.c

void initActor(void); // O como definas la funci&#243;n.

metes el #include "actor.h" en el main.c y listo.

PD: Espero no ir de sobrao y que no tengas mucha experiencia en C por que si no mi respuesta no te va a servir de nada :p.

turco
31/01/2008, 22:34
¡¡Muchas gracias a todos!! ¡¡Ya funciona!! [wei6]

Bueno cuento mi problema por si le puede ayudar a alguien más. Vereis, yo había programado antes en C pero lo había hecho siempre creando directamente el fichero *.c sin su correspondiente *.h . Nunca había tenido problemas al declarar y definir las funciones en el mismo fichero .c.

Esta vez tenía mi actor.c (encerrado en un bloque #ifndef/#endif) con la función initActor() definida dentro. Y en mi fichero main.c tenía el #include "actor.c" . No sé exactamente como se lleva a cabo el proceso de linkado, el caso es que nunca había tenido problemas hasta ahora que parece que tomaba dos declaraciones de la función initActor() y me tiraba el error que mostré en el primer post.

Lo he solucionado (mejor dicho "Lo habeis solucionado") creando un fichero actor.h y dentro he declarado la función initActor() y ha compilado a la primera.


Lo que no entiendo es porque fallaba desde Eclipse y no desde la consola. ¿Sabeis alguien como funciona el compilador y por qué fallaba?

Gracias.:lovegp2x:

lemon
08/02/2008, 13:47
desde la consola solamente compilabas el main.c, dentro del cual tenias incluido otro fichero .c distinto (cosa nada recomendable). Desde eclipse estabas compilando los dos ficheros .c por separado, por lo tanto la funcion que estaba definida en el otro era compilada dos veces, una tal cual y otra como parte del main.c, y a la hora de enlazar pues se encontraba con el problema y por eso fallaba. El problema no era de eclipse sino de la forma en que habias organizado tu código.

turco
11/02/2008, 20:59
Gracias lemon por tu explicación.

Quería saber el porqué de este error para intentar no volver a cometerlo de aquí en adelante.

WinterN
11/02/2008, 21:46
desde la consola solamente compilabas el main.c, dentro del cual tenias incluido otro fichero .c distinto (cosa nada recomendable). Desde eclipse estabas compilando los dos ficheros .c por separado, por lo tanto la funcion que estaba definida en el otro era compilada dos veces, una tal cual y otra como parte del main.c, y a la hora de enlazar pues se encontraba con el problema y por eso fallaba. El problema no era de eclipse sino de la forma en que habias organizado tu código.

¡Muy buena la explicación! Si lo hubiera sabido antes la de líneas de código que me habría ahorrado poniendo las directivas de compilador antes mencionadas.