hola a todos.
bueno el problema que tengo es que cree un makefile pero cuando lo ejecuto no se ejcutan todos los target que hago y si pongo todas las intrucciones en un solo target si se ejecuta.
a la unica manera que encontre de que se ejcute todo bien es poniendo:
make object && make clean
pero como e visto ejemplos de make con varios target por eso quisiera saber si tengo alun error o me falta algo.
CC = gcc
CFLAGS=-I/home/bugtraq/progc/make2/funcion.h \
-I/home/bugtraq/progc/make2/funciondos.h
nombre= prueba
valores=-Wall -m32 -g -c
clean=rm -f
object: $(nombre).c $(nombre).o
$(CC) $(valores) $(nombre).c -o $(nombre).o
$(CC) $(nombre).o -o $(nombre)
clean: $(nombre).o
$(clean) $(nombre).o
saludos.
drewermerc.
hola Drewermerc, a simple vista veo un par de cosas, primer punto es que un makefile es una sucesión de reglas para gestionar la compilación de una aplicación, en donde dichas reglas se definen como:
objetivo: dependencias (archivos objetos)
comandos o sentencias para compilar los .c asociados a ellos
veo que luego de tu objetivo tienes como dependecia un solo objeto, debes detallar todos para que los enlace, si llamas a una variable para ello, debería definirse arriba todos los .o necesarios; luego asociarlo a sus respectivas fuentes. (puedes hacer uso de %.o y %.c).
con lo cual, lo correcto sería mediante variables definidas o bien con %, para cada .o que dependa de .c (%.o : %.c) aplicar la regla CC.....
una regla podría ser para ello
Citar$(CC) $(valores) -c $< -o $@
lo que tendrías que hacer simplemente es a tu variable nombre, asignarle prueba, otra_prueba, etc.
Citarnombre= prueba otra_prueba
para clean otra opción es hacer un *.o, si quieres limpiar todos por ejemplo...
Citar
clean:
rm -f *.o
espero haber sido claro, es más facil verlo que explicarlo jajaaa saludos!
hola Gh057.
bueno gracias por responder, pues segun yo con lo que me dijiste tiene que quedar el codigo asi.
CC = gcc
CFLAGS=-I/home/bugtraq/progc/make2/funcion.h \
-I/home/bugtraq/progc/make2/funciondos.h
nombre= prueba
valores=-Wall -m32 -g -c
clean=rm -f
object: $(nombre).c $(nombre).o %.o : %.c
$(CC) $(valores) -c $< -o $@
$(CC) $(nombre).o -o $(nombre)
clean: $(nombre).o
$(clean) $(nombre).o
pero me dice lo siguiente.
Makefile:17: *** hay varios patrones de objetivos. Alto.
y lo intente poniendolo asi:
object: $(nombre).c $(nombre).o %.o
$(CC) $(valores) -c $< -o $@
$(CC) $(nombre).o -o $(nombre)
pero medecia.
make: *** No hay ninguna regla para construir el objetivo `%.o', necesario para `object'. Alto.
entonces se lo quite pero me sigue ejecutando solo un objetivo y el clean ya no se ejecuta.
nose si este mal alomejor y me equivoque con la sintaxis si es asi corrigeme porfavor.
hola , no no a ver podrías hacer algo así..
Citar
CC = gcc
CFLAGS=-Wall -m32 -g -c //agregas parámetros como el debugger
LDFLAGS=-I (ruta a...)/funcion.h -I (ruta a...)funciondos.h //bibliotecas externas
OBJECTS=(ruta a proyecto...)/prueba.o (ruta a proyecto...)/otra_prueba.o //objetos de prueba..
SOURCES=(ruta a proyecto..)/prueba.c (ruta a proyecto...)/otra_prueba.c //fuentes del proyecto
proyecto: $(OBJECTS)
$(CC) $(OBJECTS) -o proyecto
depend:
makedepend $(LDFLAGS) $(OBJECTS) $(SOURCES)//se ejecuta si solamente si se modifican
clean:
rm -f $(OBJECTS)
luego haz make depend y make.
obviamente podrías extraer también las rutas a un PATH... como te darás cuenta tienes muchísimas formas de hacerlo.
un cordial saludo
(agrego) el hecho de hacerlo así y no solamente con la sentencia de compilación, que de esa forma si no se modifica no compila toooodo el proyecto... puede seguir mejorándose por ejemplo: si las bibliotecas también se están desarrollando, debes linkearlas los .a por separado -puedes hasta hacer un make para automatizar dentro de cada una- y de esa manera tu trabajo avanzará más rápido.
toda la info necesaria en gnu.org, bueno un paneo muy bueno también en la wiki, etc etc.
bueno pues lo ejecuto y sigue igual solo ejecuta el primer objetivo en este caso proyecto y los demas ya no.
cuando make depende me dice esto.
makedepend -I/home/bugtraq/progc/make2/funcion.h -I/home/bugtraq/progc/make2/funciondos.h /home/bugtraq/progc/make2/prueba.o /home/bugtraq/progc/make2/prueba.c
make: makedepend: No se encontr� el programa
make: *** [depend] Error 127
que crees que este fallando.
bueno gracias revisare las paginas para aprender mas de lo makefile
hola Drewermerc, una cosa son los objetos y otra los objetivos... yo te amplié a varios objetos, y agregué lo de las dependencias, pero sigues teniendo un solo objetivo como tal, por ejemplo proyecto (o el nombre que quieras para el ejecutable) cuando es para diferentes .o ( o sea compilas por separado) ahí le agregas diferentes targets...
(bueno no es del todo cierto... depend y clean también son targets! solo que no dependen de nadie, se ejecuta el comando o sentencia asociada al llamado de los mismos)
.
en la wiki tienes un ejemplo con variables y el uso del comodín %, como te indicaba al inicio;
por favor mírate también el enlace que te pasé por mp basante similar aunque mejor explicado como el que luego te propuse.
otro lugar por donde puede ayudarte a entender el mecanismo es usando la ide anjuta, el mismo te genera automáticamente un make para tu proyecto; luego abres el makefile generado y verás que es muy similar la sintaxis, solo agrega algunos detalles como por ejemplo el uso de sufijos como .c .cpp etc...
saludos
hola bueno pues muchas gracias y perdon es que no habia visto que me habias enviado un mensaje lo siento.
bueno gracias revisare todo.
nos vemos.
saludos.
drewermerc. :)