Директивы препроцессора для нескольких компиляторов Фортрана в Windows 10 - PullRequest
0 голосов
/ 29 мая 2018

На моем компьютере 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 и, скорее всего, неправильно запутался в компиляции или добавил директивы препроцессора.Может кто-нибудь предложить мне, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 30 мая 2018

Хорошо, я понял это.Я исправил проблему, и полный текст статьи перешел к комментарию @francescalus выше:).

Следующая строка в Windows CMD создала DLL без ошибок и предупреждений, и я могу прочитать и выполнить Fortran подпрограмма в R.

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

На основании комментария @ Владимира, я хотел бы добавить, что если файл кода переименован в .F90.Затем он также может быть скомпилирован без флага -cpp, например:

 gfortran -shared -o test_mod.dll test_mod.F90 -DCOMPILER_GFORTRAN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...