Tengo un código fuente FORTRAN que consta de muchos archivos .F y .h diferentes. Necesito construir un ejecutable a partir de él, pero estoy teniendo algunos problemas. El makefile que produje hasta ahora (que puede tener errores como yo soy nuevo en esto) es:Creación de un archivo MAKE FORTRAN
# 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) [email protected] $<
%.o: %.F
$(FC) $(FLFLAGS) -o [email protected] $<
%.mod: %.h
$(FC) $(FLFLAGS) -o [email protected] $<
clean:
rm -f *.o *.mod
Cuando trato de hacer el programa, sin embargo, estoy recibiendo una gran cantidad de errores de referencia. 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.
ACTUALIZACIÓN:
Como comentaristas han señalado, que mezclado las banderas de compilación y enlace. Además, no debe compilar archivos * .h. Aquí es el último, makefile corregido:
# 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 [email protected] $<
%.o: %.F
$(FC) $(FCFLAGS) -o [email protected] $<
clean:
rm -f *.o *.mod
Ahora en que funciono hacer, se compilará cada fichero * .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 da 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
se construirá el ejecutable, por lo que parece que hice algo mal en el makefile para la etapa de vinculación.
ACTUALIZACIÓN: 5/9/2011
Sverre señaló el problema final con mi makefile. 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 makefile final 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 [email protected] $^
%.o: %.F
$(FC) $(FCFLAGS) -o [email protected] $<
# %.mod: %.h
# $(FC) $(FCFLAGS) -o [email protected] $<
clean:
rm -f *.o *.mod
Hacer es solo una manera de automatizar las tareas que podría hacer a mano. ¿Puedes compilar este código en la línea de comandos sin Make? Si no, entonces jugar con el archivo MAKE no ayudará. – Beta
Está aplicando los marcadores de enlace a la compilación, y viceversa. –
Hay demasiados archivos de origen y de encabezado con demasiadas dependencias para que pueda hacerlo a mano. unapersson, estás en lo cierto. Tontamente cambié esas dos variables. Cambiarlos me permitió construir los archivos .f. Sin embargo, gfortran me está dando errores para los archivos .h. Parece pensar que son archivos C. Pero esa es otra pregunta. Gracias por la ayuda. – Bob