que needed make entre diferencia makefile fortran

makefile - entre - no rule to make target needed by



Creando un archivo make de FORTRAN (1)

¿Estás usando GNU make? Si es así,

$(FC) $(FLFLAGS) -o $@ $<

puede ser el culpable $< es el nombre del primer requisito previo, pero desea todos los archivos *.o . Intenta usar $^ lugar.

Tengo un código fuente de FORTRAN que consiste en muchos archivos diferentes .F y .h. Necesito construir un ejecutable a partir de él, pero estoy teniendo algunos problemas. El archivo MAKE que produje hasta ahora (que puede tener errores ya que soy nuevo en esto) es:

# compiler FC = /usr/bin/gfortran-4.5 # compile flags FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons # link flags FLFLAGS = -g -fbacktrace # source files and objects SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) / $(patsubst %.h, %.mod, $(wildcard *.h)) # program name PROGRAM = blah all: $(PROGRAM) $(PROGRAM): $(SRCS) $(FC) $(FCFLAGS) $@ $< %.o: %.F $(FC) $(FLFLAGS) -o $@ $< %.mod: %.h $(FC) $(FLFLAGS) -o $@ $< clean: rm -f *.o *.mod

Sin embargo, cuando intento hacer el programa, obtengo una serie de errores de referencia no definidos. Quiero decir, cada función y llamada de subrutina en el primer archivo compilado .F devuelve un error de referencia no definido. Pensé que esto era porque gfortran estaba tratando de vincular los archivos en lugar de simplemente compilarlos y luego vincularlos al final, pero pensé que se suponía que la opción ''-c'' impedía eso.

ACTUALIZAR:

Como comentaron los comentaristas, mezclé las banderas de compilación y enlace. Además, no debe compilar archivos * .h. Aquí está el archivo MAKE corregido más reciente:

# compiler FC = /usr/bin/gfortran-4.4 # compile flags FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check -std=legacy # link flags FLFLAGS = # source files and objects SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) # program name PROGRAM = blah all: $(PROGRAM) $(PROGRAM): $(SRCS) $(FC) $(FLFLAGS) -o $@ $< %.o: %.F $(FC) $(FCFLAGS) -o $@ $< clean: rm -f *.o *.mod

Ahora cuando ejecuto make, compilará cada archivo * .F en el código, pero falla en la etapa de vinculación. Recibo un montón de errores de referencia no definidos en el primer archivo * .F. El compilador parece revisar cada archivo * .F de forma individual en la etapa de enlace, que no estoy seguro de que sea correcto. Entonces me sale un error:

/usr/lib/gcc/x86_64-linux-gnu/4.4.5/libgfortranbegin.a(fmain.o): In function `main'': (.text+0x26): undefined reference to `MAIN__'' collect2: ld returned 1 exit status

Sin embargo, si escribo el comando:

gfortran -o blah *.o

El ejecutable se compilará, por lo que parece que hice algo mal en el archivo MAKE para la etapa de vinculación.

ACTUALIZACIÓN: 5/9/2011

Sverre señaló el problema final con mi archivo MAKE. En mi primer objetivo que crea el programa, utilizo el comando de acceso directo solo para la primera dependencia ($ <), pero necesito incluir todas las dependencias (es decir, todos los archivos * .o) usando el atajo ($ ^). El archivo MAKE final y funcional es el siguiente:

# compiler FC := /usr/bin/gfortran-4.5 # compile flags FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons -fbounds-check # link flags FLFLAGS = # source files and objects SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) # $(patsubst %.h, %.mod, $(wildcard *.h)) # program name PROGRAM = vipre all: $(PROGRAM) $(PROGRAM): $(SRCS) $(FC) $(FLFLAGS) -o $@ $^ %.o: %.F $(FC) $(FCFLAGS) -o $@ $< # %.mod: %.h # $(FC) $(FCFLAGS) -o $@ $< clean: rm -f *.o *.mod