我尝试构建包含Parallel 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'
我用Google搜索并找到了一些可能的解决方案,例如https://www.myroms.org/wiki/Frequently_Asked_Questions#Errors_at_link_time,但我仍然无法解决我的问题。
问题:这是一个链接问题的库吗?如果没有,你能否就如何调试给我一些建议?如果是这样,您能否分享一下如何链接图书馆的详细步骤?谢谢。
环境库:PnetCDF 1.8.1,netCDF 4.5.1,并行IO 1.7.2,gcc 7.1.1,openmpi-2.0.2-2.fc26.x86_64
答案 0 :(得分:0)
我通过检查库路径并在本地文件夹中安装早期版本的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。