几个月前,我提出了一个关于使用netcdf4代码编写netcdf3文件的问题。现在,我有另一个问题。我有一个较旧的fortran代码,它以串行方式运行,用于将数据从一个网格内插到另一个网格。代码基于使用netcdf3文件,我想用netcdf4重新编译它。代码使用以下netcdf函数: nf_open,nf_put_vara_real等 我远非专家,但据我所知,代码仍应接受带有这些调用的netcdf4文件。但是,当我尝试使用netcdf4编译它时,我收到很多错误消息。代码本身使用的netcdf.inc与代码位于同一文件夹中,编译命令如下:
gfortran parameter.f90 netcdf_utils.f90 mean_streaks.f90 -L/opt/netcdf/netcdf3/lib/ -lnetcdf -O2
然后我尝试将netcdf3更改为4,因为我在/ opt / netcdf下有netcdf3和4个文件夹。但是,我在编译时得到了以下错误消息:
/tmp/ccgwLiTF.o: In function `__netcdf_utils_MOD_read3d':
netcdf_utils.f90:(.text+0x445): undefined reference to `nf_open_'
netcdf_utils.f90:(.text+0x4a0): undefined reference to `nf_get_vara_real_'
netcdf_utils.f90:(.text+0x4b4): undefined reference to `nf_close_'
有没有人碰巧知道我缺少什么,或者我应该如何链接库以完成编译?
提前感谢答案
答案 0 :(得分:0)
将-lnetcdff
添加到编译命令中(是的,2 f' s)。在netcdf4中,Fortran符号结束了该库而不是libnetcdf.so。
gfortran parameter.f90 netcdf_utils.f90 mean_streaks.f90 -L/opt/netcdf/netcdf4/lib/ -lnetcdf -lnetcdff -O2
您可以使用
之类的命令验证符号是否在该库中readelf -s libnetcdff.so | grep 'nf_*_'
在我的安装中,其输出包括错误中列出的所有符号。
答案 1 :(得分:0)
我发现了这个问题。问题在于我正在使用的集群上,netcdf4是用mpif90编译的,而不是gfortran。所以我将gfortran改为mpif90,并将netcdf3改为netcdf4。我还添加了其他链接,我将CMakeList用于另一个使用netcdf4的代码。最终的工作产品是:
mpif90 parameter.f90 netcdf_utils.f90 mean_streaks.f90 -I/opt/netcdf/netcdf4/include -L/opt/netcdf/netcdf4/lib -lnetcdff -L/opt/pnetcdf/pnetcdf-1.2.0/lib -L/opt/netcdf/netcdf4/hdf5.1.8.8/lib -lnetcdf -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl -O2
感谢您的帮助,我现在有另一个问题,我将在一段时间内发布:)