hacer archivo, ¿esto se ve bien?

all: run run: test.o list.o matrix.o smatrix.o gcc test.o list.o matrix.o smatrix.o -o matrix-mul list.o: list.c list.h gcc -g -c list.c matrix.o: matrix.c matrix.h gcc -g -std=c99 -c -o matrix.o matrix.c smatrix.o: smatrix.c smatrix.h gcc -g -c -o smatrix.o smatrix.c test.o: test.c test.h gcc -g -c test.c 

Estaba teniendo muchos problemas para hacer un makefile y finalmente conseguí este trabajo. Y solo quiero asegurarme de que estén bien (no solo para hacer que el progtwig se ejecute, sino en términos de un buen archivo make)

Una pregunta es por qué matrix.o y smatrix.o tienen archivos .o en la línea gcc -g -c … donde, como list.o y test.o, no tienen esa línea …

Tuve que agregar -std = c99 porque estaba recibiendo un error de bucle extraño pero aún no entiendo por qué necesito poner matrix.o en la línea …

El archivo está bien. No es muy fácil de mantener.

Este sitio web tiene un tutorial realmente bueno sobre cómo hacer buenos makefiles: http://mrbook.org/blog/tutorials/make/

Especialmente mira el último ejemplo:

 CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@ 

Esto debería mostrarle cómo mejorar la capacidad de mantenimiento (agregar archivos adicionales a SOURCES , y el rest se realiza automáticamente.

Los siguientes archivos son compatibles con make all make depend y make clean ; solo necesita cambiar las primeras líneas. Recuerda make depend si cambias incluye en cualquier archivo.

 TARGET:=matrix-mul SOURCES:=test.c list.c matrix.c smatrix.c OBJECTS:=$(SOURCES:%.c=%.o) CC=gcc CFLAGS=-g -std=c99 -Wall LD=gcc LDFLAGS= # First target - simply say that we want to produce matrix-mul all: $(TARGET) # To create the target we need all .o files, and we link with LD/LDFLAGS # $@ is the file we're making, aka matrix-mul $(TARGET): $(OBJECTS) $(LD) -o $@ $(OBJECTS) $(LDFLAGS) #Creating a .o from a .c # $< is the c file, $@ is the corresponding .o file .co: $(CC) $(CFLAGS) -c $< -o $@ # Regenerate dependencies depend: $(CC) $(CFLAGS) -MM $(SOURCES) > .depend # Remove produced files clean: rm -rf $(OBJECTS) $(TARGET) .depend # If there's no dependency file, create it .depend: depend # Include the autogenerated dependency file include .depend 

EDITAR: Si desea esto aún más genérico, puede reemplazar la línea FUENTE: = con:

 SOURCES:=$(wildcard *.c) 

Este makefile simplemente creará TARGET a partir de todos los archivos .c en el directorio actual.

Una cosa que sugeriría aquí sería agregar un objective clean que elimine todos sus archivos intermedios (probablemente todos los archivos .o ), de esta manera:

 clean: rm *.o 

Para obtener crédito adicional, ponga todos sus archivos *.o en una variable make, y use esa variable como el objective de la regla de ejecución, y después del comando rm anterior.

La razón por la que quiero que hagas esto es para propósitos de depuración. Puede ser que tengas una de las reglas anteriores equivocada, pero como ya .o todos tus archivos .o una vez, solo está recogiendo uno viejo cada vez. Si usted hace una make clean antes de su construcción, atrapará eso.