使用 NetCDF 的 R CMD SHLIB Fortran 90 文件

Posted

技术标签:

【中文标题】使用 NetCDF 的 R CMD SHLIB Fortran 90 文件【英文标题】:R CMD SHLIB Fortran 90 file which use NetCDF 【发布时间】:2020-08-07 04:24:37 【问题描述】:

我想编译一个使用 NetCDF 的 fortran 90 文件。我已经安装了NetCDF-Fortran,如图here,编译文件test_nc.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-fortran 库?

?SHLIB 节目

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

所以我想这是可能的

【问题讨论】:

【参考方案1】:

在对R CMD SHLIB 的调用中,您从nf-config 提供的选项仅被视为链接器 选项。编译步骤失败,因为需要在链接过程之前设置 NetCDF Fortran 模块的搜索路径。

要从nf-config 添加-I... 选项,您可以使用环境变量PKG_FCFLAGS

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

或者,您可以将 PKG_FCFLAGS 放入您的 Makevars 文件中。

(请注意,与 C 和 C++ 不同,模块文件的包含路径选项不适用于预处理阶段。)

【讨论】:

object test_nc.so 返回分段错误(核心转储)。我尝试包含 Makevars,但给出了未定义的符号:__netcdf_MOD_nf90_close。根据github.com/Unidata/netcdf-fortran/issues/76,它使用正确的标志编译。 如果使用Makevars,那么您仍然需要将链接器选项设置为指向库。您是在Makevars 中设置链接器选项还是在命令行上继续使用nf-config --flibs?还是尝试加载库时未定义的符号? 我假设分段错误来自它确实有效并且您尝试在 R 会话中使用test_nc.so。您是如何尝试从 R 中调用它的? 在 Makevars 上,如果我写 PKG_FCFLAGS="nf-config --fflags --flibs" 我得到“无法打开模块文件‘netcdf.mod’”。当我取出“--flibs”时,我得到“未定义的符号:__netcdf_MOD_nf90_close”。当我试图在这里创建一个 R 包时,我用“R CMD INSTALL”来称呼它。我是否需要创建一个 confgure.ac? PKG_FCFLAGS 应该只是 --fflags 选项,用于编译器标志。来自--flibs 的链接器标志必须在别处给出,例如在R CMD 命令中。我给出的完整 env ... 命令是否适用于您的情况?

以上是关于使用 NetCDF 的 R CMD SHLIB Fortran 90 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 grib 文件转换为 netcdf(jpeg 格式)

使用 R 扩展 netCDF 文件中的尺寸

访问 netcdf 文件中嵌套组中的变量(文件格式 HDF5)

在 R 中创建多维 NetCDF

如何使用 R 中的纬度/经度边界从 netCDF 文件中获取子集

如何在 R 中使用 netcdf 数据进行 PCA