Ver la versión completa : Ayuda con Eclipse
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.
Parece que initActor() lo tienes definido en más de un fichero.
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
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ún include pones al principio de él algo en plan?
#ifndef actor_h
#define actor_h
[...]
#endif
Probaré ese comando en cuanto llegue a mi casa :rolleyes:. El que sí sé 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.
turco, el bloque #ifndef es fundamental en C para evitar lo que te está pasando. Revísalo porque muy probablemente ése sea el problema. Por otro lado, si pones por aquí el fuente te podremos ayudar más. Aunque borres el contenido de las funciones para que no lo veamos :)
Desarrollar en Linux. ¿Acaso se puede desarrollar en otras plataformas? Ah, sí, 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 :)
Mi respuesta está en sintoní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ía de generar automatiamente el eclipse, incluye el nombre de la función que quieras utilizar en el main.c
void initActor(void); // O como definas la funció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.
¡¡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:
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.
Gracias lemon por tu explicación.
Quería saber el porqué de este error para intentar no volver a cometerlo de aquí en adelante.
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.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.