Compilation 使用netcdf3将fortran代码链接到netcdf4

Compilation 使用netcdf3将fortran代码链接到netcdf4,compilation,fortran,netcdf,Compilation,Fortran,Netcdf,几个月前,我提出了一个关于使用netcdf4代码编写netcdf3文件的问题。现在,我有另一个问题。我有一个旧的fortran代码,它以串行方式运行,用于将数据从一个网格插值到另一个网格。代码基于使用netcdf3文件,我想用netcdf4重新编译它。该代码使用以下netcdf函数: nf_打开,nf_放置,nf_vara_真实等。 我远非专家,但据我所知,代码仍然应该接受带有这些调用的netcdf4文件。然而,当我尝试用netcdf4编译它时,我得到了很多错误消息。代码本身使用与代码位于同一文

几个月前,我提出了一个关于使用netcdf4代码编写netcdf3文件的问题。现在,我有另一个问题。我有一个旧的fortran代码,它以串行方式运行,用于将数据从一个网格插值到另一个网格。代码基于使用netcdf3文件,我想用netcdf4重新编译它。该代码使用以下netcdf函数: nf_打开,nf_放置,nf_vara_真实等。 我远非专家,但据我所知,代码仍然应该接受带有这些调用的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_'
有没有人知道我遗漏了什么,或者我应该如何链接这些库来完成编译

感谢您提前给出答案

将-lnetcdff添加到编译命令中是的,2个f。在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_*_'

在我的安装中,其输出包括错误中列出的所有符号。

我发现了问题。问题是,在我使用的集群上,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 
谢谢你的帮助,我现在有另一个问题,稍后我会发布: