Problemas de compilacion, gcc

Bueno, es que me estoy volviendo loco intentando compilar unas practicas... a lo que voy, os cuento el caso.


tengo el modulo A, que este a su vez hace uso de funciones y estructuras decladaras en el modulo B

La cabecera del moduloA.h

#include "moduloB.h"

para crear el objeto

gcc -c moduloA.c

tengo el modulo C, que este a su vez hace uso de funciones y estructuras decladaras en el modulo B

La cabecera del moduloC.h

#include "moduloB.h"

para crear el objeto

gcc -c moduloC.c


El problema viene cuando intento compilar un programa menu, que gestione los modulos anteriores.

la cabecera del menu seria

#include "moduloA.h"
#include "moduloC.h"

Para compilarlo seria:


gcc moduloA.o moduloB.o mudoloC.o menu.c

No puedo compilarlo, si solo hago un menu para uno de los modulos si que puedo, pero si intento hacer que el menu gestione los dos modulos no consigo compilarlo.

El compilador me dice que hay conflictos con los type def, que ya han sido declarados en otra parte, e igual con las estructuras, vamos, que en los dos modulos (A y C), hacen uso del muduloB, me sale el error, y no puedo crear el objeto (.o) de los modulos A y C sin hacer uso del modulo B.

Espero que se entienda la duda.

Gracias.
Pues nunca lo he hecho como comentas..
Pero te sugiero que uses un makefile.

creas ficheros .h con las declaraciones de los tipos de los .h
Los .c con su código y luego el makefile...

Yo creo que será más fácil..
Suerte.
sugerencia
Software libre
quizas
Si no he entendido mal, no te funcionaría el programa si haces:

gcc -c -Wall moduloB.c
gcc -c -Wall moduloA.c
gcc -c -Wall moduloC.c
gcc -c -Wall menu.c
gcc moduloB.o moduloA.o moduloC.o menu.o

¿Pero si quitas moduloA (p. ej) si?

Por cierto, secundo lo del makefile, compilar y enlazar todo el rato es un coñazo. Supongo que sería algo así:

menu: moduloB.o moduloA.o moduloC.o menu.o
   gcc -Wall moduloB.o moduloA.o moduloC.o menu.o -o menu

moduloB.o: moduloB.c moduloB.h
   gcc -c -Wall moduloB.c
moduloA.o: moduloA.c moduloA.h moduloB.h
   gcc -c -Wall moduloA.c
moduloC.o: moduloC.c moduloC.h moduloB.h
   gcc -c -Wall moduloC.c
menu.o: moduloA.h moduloC.h menu.c
   gcc -c -Wall menu.c


PD: Yo suelo poner '-Wall' para los warnings, es útil para ver errores.

[bye]
frankKM escribió:sugerencia
Software libre
quizas


mmmm... estoy compilando en una maquina unix (HP-UX) y es ahi donde tiene que funcionar, xdd.

CaDeTe1 escribió:Si no he entendido mal, no te funcionaría el programa si haces:

gcc -c -Wall moduloB.c
gcc -c -Wall moduloA.c
gcc -c -Wall moduloC.c
gcc -c -Wall menu.c
gcc moduloB.o moduloA.o moduloC.o menu.o

¿Pero si quitas moduloA (p. ej) si?

Por cierto, secundo lo del makefile, compilar y enlazar todo el rato es un coñazo. Supongo que sería algo así:

menu: moduloB.o moduloA.o moduloC.o menu.o
   gcc -Wall moduloB.o moduloA.o moduloC.o menu.o -o menu

moduloB.o: moduloB.c moduloB.h
   gcc -c -Wall moduloB.c
moduloA.o: moduloA.c moduloA.h moduloB.h
   gcc -c -Wall moduloA.c
moduloC.o: moduloC.c moduloC.h moduloB.h
   gcc -c -Wall moduloC.c
menu.o: moduloA.h moduloC.h menu.c
   gcc -c -Wall menu.c


PD: Yo suelo poner '-Wall' para los warnings, es útil para ver errores.

[bye]


Si, si quito el muduloA y todas las llamadas de funciones que hay en el menu respecto al moduloA, si que funciona perfectamente el menu.

Para compilar, lo que tengo es un script que me lo hace todo.


Bueno, ahora estoy haciendo el makefile (mmm.. nunca lo habia usado.. y me da algun que otro fallo)

bueno, en concreto el makefile que estoy haciendo es este

menu2: funciones.o fcotizaciones.o mezclaNaturalSD.o mezclaPolifasica.o menu2.o
gcc -Wall funciones.o fcotizaciones.o mezclaNaturalSD.o mezclaPolifasica.o menu2.o -o menu

funciones.o: funciones.c funciones.h
gcc -c -Wall funciones.c
fcotizaciones.o: fcotizaciones.c fcotizaciones.h funciones.h
gcc -c -Wall fcotizaciones.c
mezclaNaturalSD.o: mezclaNaturalSD.c mezclaNaturalSD.h fcotizciones.h
gcc -c -Wall mezclaNaturalSD.c
mezclaPolifasica.o: mezclaPolifasica.c mezclaPolifasica.h fcotizciones.h
gcc -c -Wall mezclaPolifasica.c
menu2.o: mezclaNaturalSD.h mezclaNatural.h menu2.c
gcc -c -Wall menu2.c


y me da fallo en la linea 8, en la de mezclaNaturalSD, me dice que debe de haber un separador en la reglas de la linea8

De todas formas el scrip que uso para compilar es el siguiente


gcc -c funciones.c
gcc -c fcotizaciones.c
gcc -c mezclaPolifasica.c
gcc -c mezclaNaturalSD.c

gcc funciones.o fcotizaciones.o mezclaNaturalSD.o mezclaPolifasica.o menu2.c


El problema viene al crear el objeto del menu2.o que ess donde falla.

Lo siento por el toston.

Saludos.



Editado:

He encontrado una solucion un tanto guarra.. pero por lo menos funciona...

Enconcreto lo que he hecho ha sido (usando el simil de nombre de modulo...)

el moduloA usa el modulo B, y el modulo C en vez de hacer uso del moduloB, hace uso del moduloA, (aunque realmente lo que usa son las operaciones del modulo B)

Y asi funciona bien.. pero me parece una solucion un tanto mmm.. chapucera.

Si sabeis como podria solucionarlo sin hacer esa guarrada os lo agradeceria.

Saludos.


Edicion 2 !!

Ya esta todo arreglado y de forma no chapucera... simplemente con poner sentencias para el compilador ha sido resuelto el problema...

En concreto para los que quieran saber como, en el modulo que se compartia, (el moduloB) he puesto:

#ifndef _MODB_
#define _MODB_

struct.....

void MisFunciones........
...

#endif


Con esto esta arreglado... y pensar que nunca usaria sentencias en tiempo de compilacion, xddd.

Saludos a todos y gracias por la ayuda
4 respuestas