我有一组.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代码但仍然可以正确编译。或者汇编程序行中的一个标志,它允许使用不同编译器编译的不同代码将程序组合在一起。
非常欢迎任何建议。
非常感谢
詹姆斯
答案 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
。此外,通过使用模块,您可以避免这些问题并获得许多其他优势。