Windows 10上多个Fortran编译器的预处理器指令

时间:2018-05-29 19:14:33

标签: r windows fortran

在我的Windonws 10(x64)计算机上,我一直尝试通过Fortran使用R函数在.Fortran()中调用gfortran个子例程。以下示例代码(test.f90)工作正常:

示例代码:

! Computes the square of a number

Subroutine sr1(a,b)
!DEC$ ATTRIBUTES DLLEXPORT::sr1
!DEC$ ATTRIBUTES C, REFERENCE, ALIAS:'sr1' :: sr1

implicit none
integer a,b
b = a*a
End Subroutine sr1

我在gfortran编译了代码,运行正常:

gfortran -shared -o test.dll test.f90

然后在R中调用此子例程:

dyn.load("path_to_file/test.dll")
is.loaded("sr1") #Returns TRUE
.Fortran("sr1", a=as.integer(12), b=as.integer(10))

我想做什么:

我的机器上也安装了英特尔Fortran(iFORT)和Lahay Fortran编译器。现在,我想在上面的代码中为这些多个Fortran编译器添加预处理器指令(以便所有编译器可以使用相同的test.f90文件)。

我尝试了什么:

我找到了相关问题here,并尝试修改代码(test_mod.f90),如下所示:

! Computes the square of a number

Subroutine sr1(a,b)

#ifdef COMPILER_GF
    !DEC$ ATTRIBUTES DLLEXPORT::sr1
    !DEC$ ATTRIBUTES C, REFERENCE, ALIAS:'sr1' :: sr1
#endif

#ifdef COMPILER_IF
    !DEC$ ATTRIBUTES DLLEXPORT, STDCALL ::sr1 
    !DEC$ ATTRIBUTES DECORATE, ALIAS : 'sr1' :: sr1
    !DEC$ ATTRIBUTES REFERENCE :: a,b
#endif

#ifdef COMPILER_LF
    dll_export sr1
#endif

implicit none
integer a,b
b = a*a
End Subroutine sr1

我尝试使用以下代码编译代码:

 gfortran -shared -o test_mod.dll test_mod.f90 -DCOMPILER_GF

并得到了这个错误:

Warning: test_mod.f90:5: Illegal preprocessor directive
Warning: test_mod.f90:8: Illegal preprocessor directive
Warning: test_mod.f90:10: Illegal preprocessor directive
Warning: test_mod.f90:14: Illegal preprocessor directive
Warning: test_mod.f90:16: Illegal preprocessor directive
Warning: test_mod.f90:18: Illegal preprocessor directive
test_mod.f90:17.1:

 dll_export sr1
 1
Error: Unclassifiable statement at (1)

我是Fortran的新手,很可能是在编译时弄乱了,或者以不正确的方式添加了预处理器指令。有人可以建议我如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

好的,我弄明白了。我解决了问题,完整的学分转到@francescalus的评论上面:)。

Windows CMD处的以下行创建了DLL,没有错误和警告,我能够在Fortran中阅读并执行R子例程。

gfortran -shared -o test_mod.dll test_mod.f90 -DCOMPILER_GFORTRAN -cpp

基于@ Vladimir的评论,我想补充一点,如果代码文件重命名为.F90。然后,它也可以在没有-cpp标志的情况下编译,如下所示:

 gfortran -shared -o test_mod.dll test_mod.F90 -DCOMPILER_GFORTRAN