编写一个Makefile来编译.f程序和使用为Ifort编写的.f90代码为gfortan编译器编写的代码

时间:2014-07-25 11:18:25

标签: makefile fortran gfortran intel-fortran

我有一组.f代码编写在gfortran中编译,还有一个Makefile编写程序。

我想在此程序中使用另外的代码NewCode.f90,但这是一个.f90,并且编写为使用Ifort编译。我编写了一个make文件,以便编译ifort中的所有代码,因为这是NewCode.f90所需的:

FC=ifort

ARCH = linux

include SYS.$(ARCH)

MYFLGS = -O0 -pg -g -fbounds-check -Wall -fbacktrace -finit-real=nan
LINKFLAGS = -L$(MKLROOT)
FFLAGS = $(MYFLGS) -I$(INCDIR) -static

.SUFFIXES: .o .f .c .f90

.f.o:
    $(FC) $(FFLAGS) -c $*.f
NewCode.o NewCode.f90:
    $(FC) $(FFLAGS) -ffree-form NewCode.f90 -c
.c.o:
    $(CC) $(CFLAGS) -c $*.c

OBJ =   code1.o code2.o code3.o NewCode.o

default:    nonlinear

nonlinear:  setnl Program

setnl:
/bin/rm -f *.o *.bak core par.h
/bin/ln -sf INCLUDE/nonlinear.par par.h

clean:
/bin/rm -f *.o *.bak core par.h
/bin/rm -rf ../bin/*

cleanarch:
/bin/rm -f *.o *.bak core par.h
/bin/rm -f $(INSTDIR)/program


program:    program.f program.o $(OBJ) par.h
            $(FC) $(FFLAGS) $(LINKFLAGS) -o $@ program.o $(OBJ) $(LIBS)  -Wl,--start-group -L$(MKLROOT)/lib/intel64 -lmkl_gf_ilp64 -lmkl_core -lmkl_sequential -Wl,--end-group -lpthread

当我创建这个文件时,使用ifort编译器编译使用(我认为)fortran 70编写的文件会遇到问题。例如,程序调用IPARITY函数:

FUNCTION IPARITY(l)
IMPLICIT REAL*4 (A-H, O-Z)

k = l/2
kk = 2*k - l
IF ( kk.EQ.0 ) THEN
  IPARITY = 1
ELSE
  IPARITY = -1
END IF
RETURN
END

将其称为,例如:

PRINT *,IPARITY(1)

当我使用gfortran编译这个程序时,这个函数被编译和调用没有任何问题,但是当我用ifort编译它时会出现问题。看来编译器期望IPARITY是一个数组:

An array-valued argument is required in this context. 

我尝试使用gfortran编译fortran 70中编写的文件,使用ifort编译fortran 90中的文件,但是我还没有设法完成这个:

COMP=ifort
ARCH=linux 
...
...
.f.o:
    $(FC) $(FFLAGS) -c $*.f
NewCode.o NewCode.f90:
    $(COMP) $(FFLAGS) -ffree-form NewCode.f90 -c
.c.o:
    $(CC) $(CFLAGS) -c $*.c
...
...
...
program: program.f program.o $(OBJ) par.h
            $(FC) $(FFLAGS) $(LINKFLAGS) -o $@ program.o $(OBJ) $(LIBS)  -Wl,--start-group -L$(MKLROOT)/lib/intel64 -lmkl_gf_ilp64 -lmkl_core -lmkl_sequential -Wl,--end-group -lpthread

然而天气我把组合器放在:

program:    program.f program.o $(OBJ) par.h
            $(FC) ...

或者

program:    program.f program.o $(OBJ) par.h
            $(COMP) ...

我分别在.f90和.f代码中出错。

我认为需要的是makefile中的标签:

  .f.o:
  $(FC) $(FFLAGS) -c $*.f

这将告诉编译器它正在读取fortran 70代码但仍然可以正确编译。或者汇编程序行中的一个标志,它允许使用不同编译器编译的不同代码将程序组合在一起。

非常欢迎任何建议。

非常感谢

詹姆斯

1 个答案:

答案 0 :(得分:3)

您的代码仍然非常不完整,但我至少会尝试从您的代码段中猜出最高机密的内容。

可能您未能将IPARITY声明为EXTERNAL,尽管您应始终为外部函数执行此操作。在Fortran 2008中有不同的函数IPARITY,因此编译器认为你想要这个。要告诉它你想要自己的外部程序将其声明为EXTERNAL

     EXTERNAL IPARITY
     integer iparity
     ...
     print *,IPARITY(4)

如果您使用Fortran 90或更新版

,请使用接口块
     interface
       integer function iparity(i)
         integer i
       end function
     end interface
     ...
     print *,IPARITY(4)

对于您以后的所有程序,我强烈建议至少使用Fortran 90并在所有范围内使用implicit none。此外,通过使用模块,您可以避免这些问题并获得许多其他优势。