2011-05-03 15 views
12

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 
+0

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

+5

Está aplicando los marcadores de enlace a la compilación, y viceversa. –

+0

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

Respuesta

11

¿Está utilizando GNU make? Si es así,

$(FC) $(FLFLAGS) -o [email protected] $< 

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

+2

Sí, esto es perfecto. Hice el cambio y funcionó. El último archivo de trabajo está publicado en mi pregunta original. Lo curioso es que, en realidad, rastreé un makefile para este código en mi oficina el otro día. Sin embargo, es como 20 veces más largo que el mío porque enumeran cada dependencia individual. Muy contento de haber aprendido la forma correcta de hacer esto. – Bob

+1

si una respuesta resolvió su problema, debe marcarlo para – steabert

+0

Normalmente, la gente usa '$ (FFLAGS)' en lugar de '$ (FLFLAGS)' –

Cuestiones relacionadas