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