На моем компьютере 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))
Что я хотел бы сделать:
У меня также есть IntelКомпиляторы Fortran (iFORT
) и Lahay Fortran
установлены на моей машине.Теперь я хотел бы добавить директивы препроцессора в приведенный выше код для этих нескольких компиляторов Фортрана (чтобы один и тот же файл test.f90
можно было использовать для всех компиляторов).
Что я пробовал:
Я нашел соответствующий вопрос здесь и попытался изменить код (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 и, скорее всего, неправильно запутался в компиляции или добавил директивы препроцессора.Может кто-нибудь предложить мне, как я могу решить эту проблему?