地球系统模型编译报错:PnetCDF与NetCDF系列库链接顺序问题
问题
我正在研究地球系统模型,目前尝试运行一个低计算量测试用例。系统环境为Ubuntu 20.04,已按以下顺序完成所有依赖库的编译安装(使用GCC/gfortran 9.4.0,无编译报错):
- mpich-3.3.1
- pnetcdf-1.12.3
- zlib-1.2.13
- hdf5-1.10.5
- netcdf-c-4.9.0
- netcdf-fortran-4.6.0
- LAPACK&BLAS-3.11
为支持并行I/O,严格遵循了PnetCDF→HDF5→NetCDF-C→NetCDF-Fortran的安装依赖顺序。
当前在模型编译最后阶段生成可执行文件时失败,报错:
collect2: error: ld returned 1 exit status
具体错误表现为libpio.a中出现大量nfmpi_*函数未定义引用。当前使用的库链接顺序如下:
-L/home/ubuntuvm/CESM_Library/lib -lnetcdff -lnetcdf \ -Wl,-rpath=/home/ubuntuvm/CESM_Library/lib -lnetcdf -lm -lnetcdf -lhdf5_hl \ -lhdf5 -lpnetcdf -ldl -lm -lz -Wl,-rpath=/home/ubuntuvm/CESM_Library/lib -lpnetcdf
请求指导正确的库链接顺序以解决该问题。
解决方案
问题根源
- 缺失MPI库链接:
nfmpi_*系列函数属于NetCDF的并行I/O接口,依赖MPI库(即你安装的mpich),当前链接参数中未添加mpich的库引用,导致符号无法解析。 - 库链接顺序混乱:链接器遵循「先引用的库后链接」的规则,当前存在重复链接
-lnetcdf、-lm的情况,且依赖关系的顺序不符合要求。
正确的链接顺序
替换为以下链接参数(注意保持顺序,不要随意调整):
-L/home/ubuntuvm/CESM_Library/lib \ -Wl,-rpath=/home/ubuntuvm/CESM_Library/lib \ -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lpnetcdf -lz -ldl -lm -lmpi -lmpifort
顺序说明
-lnetcdff:NetCDF Fortran接口库,依赖后面的NetCDF C库-lnetcdf:NetCDF C库,依赖HDF5和PnetCDF-lhdf5_hl:HDF5高层库,依赖基础HDF5库-lhdf5:基础HDF5库,依赖zlib和PnetCDF-lpnetcdf:PnetCDF库,支持并行I/O-lz:zlib压缩库,HDF5依赖它-ldl:动态链接库,HDF5可能需要-lm:数学库,多个科学库依赖它-lmpi、-lmpifort:MPICH的C和Fortran接口库,提供nfmpi_*所需的MPI并行基础支持
额外检查
- 若mpich未安装在系统默认路径,需添加
-L参数指向其lib目录,同时在-Wl,-rpath中补充该路径,例如:-L/your/mpich/install/path/lib -Wl,-rpath=/your/mpich/install/path/lib - 确认编译NetCDF-C时开启了并行支持选项(如
--enable-parallel),否则不会生成nfmpi_*相关符号。
内容的提问来源于stack exchange,提问作者Aatreyee
相关产品推荐
相关产品推荐

