R CMD SHLIB Фортран 90 файл, который использует NetCDF - PullRequest
6 голосов
/ 23 апреля 2020

Я хотел бы скомпилировать файл fortran 90, который использует NetCDF. Я установил NetCDF-Fortran и, как показано здесь , для компиляции файла test_n c .f90:

program test_nc
    use netcdf
    implicit none
    integer :: ncid, nc_err

    nc_err = nf90_open('test.nc', nf90_nowrite, ncid)
    nc_err = nf90_close(ncid)
end program test_nc

Компиляция с помощью gfortran

gfortran test_nc.f90 -o test_nc `nf-config --fflags --flibs`

где nf-config --fflags --flibs:

-I/usr/include
-L/usr/lib -lnetcdff -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -lnetcdf -lnetcdf -ldl -lz -lcurl -lm

Замена программы подпрограммой:

subroutine test_nc
    use netcdf
    implicit none
    integer :: ncid, nc_err

    nc_err = nf90_open('test.nc', nf90_nowrite, ncid)
    nc_err = nf90_close(ncid)
end subroutine test_nc

Однако, когда я запускаю

R CMD SHLIB test_nc.f90  `nf-config --fflags --flibs`

приводит к:

gfortran -fno-optimize-sibling-calls  -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-k1TtL4/r-base-3.6.1=. -fstack-protector-strong  -c  test_nc.f90 -o test_nc.o
test_nc.f90:2:8:

    2 |     use netcdf
      |        1
Fatal Error: Cannot open module file ‘netcdf.mod’ for reading at (1): No such file or directory
compilation terminated.

Кроме того, когда я пытаюсь:

R CMD SHLIB test_nc.f90 -I/usr/include -L/usr/lib -lnetcdff -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -lnetcdf -lnetcdf -ldl -lz -lcurl -lm
gfortran -fno-optimize-sibling-calls  -fpic  -g -O2 -fdebug-prefix-map=/build/r-base-k1TtL4/r-base-3.6.1=. -fstack-protector-strong  -c  test_nc.f90 -o test_nc.o

приводит к:

test_nc.f90:2:8:

    2 |     use netcdf
      |        1
Fatal Error: Cannot open module file ‘netcdf.mod’ for reading at (1): No such file or directory
compilation terminated.
make: *** [/usr/lib/R/etc/Makeconf:195: test_nc.o] Error 1

Как я могу сказать R CMD SHLIB использовать Netcdf библиотеки -forran?

? SHLIB показывает

R CMD SHLIB -o mylib.so a.f b.f -L/opt/acml3.5.0/gnu64/lib -lacml

Так что я думаю, что это возможно сделать

1 Ответ

5 голосов
/ 26 апреля 2020

При вызове R CMD SHLIB опции, которые вы предоставили от nf-config, принимаются только как опции linker . Этап компиляции завершается неудачно, поскольку перед процессом связывания требуется задать путь поиска для модуля NetCDF Fortran.

Чтобы добавить параметр -I... из nf-config, можно использовать переменную среды PKG_FCFLAGS:

env PKG_FCFLAGS="`nf-config --fflags`" R CMD SHLIB test_nc.f90 `nf-config --flibs`

Кроме того, вы можете поместить PKG_FCFLAGS в ваш файл Makevars.

(Обратите внимание, что, в отличие от C и C ++, опция пути включения для файлов модулей не предназначена для стадии обработки.)

...