对“__netcdf_MOD_nf90_”的未定义引用

Undefined reference to ''__netcdf_MOD_nf90_"

我正在尝试构建包含并行 IO (1.7.2) 的 Fortran 模型。但是我遇到了很多这样的错误:

pionfwrite_mod.F90:(.text+0x1bad): undefined reference to `nfmpi_iput_vara_'
pionfwrite_mod.F90:(.text+0x21ad): undefined reference to `__netcdf_MOD_nf90_put_var_1d_fourbyteint'
pionfwrite_mod.F90:(.text+0x22a9): undefined reference to `__netcdf_MOD_nf90_inquire_variable'
pionfwrite_mod.F90:(.text+0x27e5): undefined reference to `__netcdf_MOD_nf90_put_var_1d_fourbyteint'
pionfwrite_mod.F90:(.text+0x2ad7): undefined reference to `__netcdf_MOD_nf90_put_var_1d_fourbyteint'

我用谷歌搜索并找到了一些可能的解决方案,例如 https://www.myroms.org/wiki/Frequently_Asked_Questions#Errors_at_link_time,但我仍然无法解决我的问题。

问题:这是库 linking 问题吗?如果没有,你能给我一些关于如何调试的建议吗?如果是这样,您能否分享有关如何 link 图书馆的详细步骤?谢谢。

环境库:PnetCDF 1.8.1、netCDF 4.5.1、Parallel IO 1.7.2、gcc 7.1.1、openmpi-2.0.2-2.fc26。x86_64

我通过检查库路径并在本地文件夹中安装早期版本的 netcdf 和 pnetcdf 解决了我的问题。

此 MPAS 模型的 makefile 将 netcdf 路径和库设置如下:

ifneq "$(NETCDF)" ""
        CPPINCLUDES += -I$(NETCDF)/include
        FCINCLUDES += -I$(NETCDF)/include
        LIBS += -L$(NETCDF)/lib
        NCLIB = -lnetcdf
        NCLIBF = -lnetcdff
        ...
endif

而对于linux F26,似乎使用DNF安装的netcdf(不确定是否是DNF的原因)没有建立一个单独的文件夹将所有相关文件放在$NETCDF下,相关文件是而是安装在 /usr/local/include 和 /usr/lib64

$ which netcdf
/usr/local/include/netcdf

$ which libnetcdf.so.11
/usr/lib64/libnetcdf.so.11

导致模型构建错误。

我试图修改 makefile,但它导致了许多其他错误。所以我保持makefile不变,并在单独的本地文件夹中从源构建单独的netcdf和pnetcdf,并使用相应的路径重建PIO和编译模型,这解决了我的问题。请注意,对于 MPAS 模型 运行,这些 pnetcdf 和 netcdf 路径也应作为 LD_LIBRARY_PATH 添加到 ~/.bashrc 中。可以在此处找到更多说明:http://www2.mmm.ucar.edu/projects/mpas/tutorial/UK2015/index.html.