Pregunta
Admite que algunos archivos incluyan un programa en C, y que otro esté compuesto por otros, de la siguiente manera:
----------------------------------------
File | Included files
----------------------------------------
main.c | stdio.h, table.h
----------------------------------------
list.c | list.h
----------------------------------------
symbol.c | symbol.h
----------------------------------------
table.c | table.h
----------------------------------------
table.h | symbol.h, list.h
----------------------------------------
por favor ayúdame a crear un makefile, ¡muchas gracias! Este es mi Makefile, pero ¿hay algún problema? ¿Quién puede depurar estos problemas, gracias!
hello: main.o table.o
gcc main.o table.o -o hello
main.o: main.c table.h
gcc -c main.c
table.o: table.c table.h
gcc -c table.c
symbol.o: symbol.c symbol.h
gcc -c symbol.c
list.o: list.c list.h
gcc -c list.c
clean:
rm hello *.o
Solución
Aquí hay un comienzo, no exactamente cómo lo haría un profesional, pero es bueno para un nivel principiante:
hello: main.o list.o symbol.o table.o
gcc -o hello main.o list.o symbol.o table.o
main.o: main.c table.h symbol.h list.h
gcc -c -o main.o main.c
list.o: list.c list.h
gcc -c -o list.o list.c
symbol.o: symbol.c symbol.h
gcc -c -o symbol.o symbol.c
table.o: table.c table.h symbol.h list.h
gcc -c -o table.o table.c
clean:
rm hello *.o
El problema específico con su archivo MAKE dado es que no está vinculando en todos los archivos de objetos. Porque main.c
incluye table.h
y table.h
incluye symbol.h
y list. h
, su programa seguramente necesitará vincular symbol.o
y list.o
también.
También es una buena práctica seguir las dependencias de encabezado (por ejemplo, main.o
depende de table.h
y symbol.h /list.h
porque table.h
depende de esos dos), esto se debe a que no hay "ordenado" forma de obtener un archivo intermedio para dependencias de encabezado.
Y rara vez se colocan encabezados estándar en los archivos de creación simplemente porque no se espera que cambien; si lo hacen (nuevo compilador), simplemente limpie y actualice.