Fortran调用netCDF时出现undefined reference to `check_'错误求助
Fortran调用netCDF时出现
check_未定义引用的解决方法 我尝试用Fortran调用netCDF库编写程序,编译时执行指定命令,但出现undefined reference to 'check_'的链接错误,相关代码、编译命令及错误信息如下:
源代码
PROGRAM net1 use netcdf IMPLICIT NONE CHARACTER(len = 256) :: fi REAL, ALLOCATABLE :: T2(:,:,:) INTEGER :: dx, dy INTEGER :: ncid, varid INTEGER :: start(3), cou(3) fi = "wrfout_d10_2016-10-06_00.nc" dx = 209 dy = 209 call check(nf90_open(fi, NF90_NOWRITE, ncid), "opening T2 file") call check(nf90_inq_varid(ncid, "T2", varid), "getting T2 varid") allocate(T2(0, dx, dy)) start = [0, 0, 0] cou = [0, dx, dy] WRITE(*, *) "Reading Grid T2" call check(nf90_get_var(ncid, varid, T2, start = start, count = cou), "reading T2") WRITE(*, *) "T2 : ", sum(T2) / size(T2) call check(nf90_close(ncid), "closing T2 file") deallocate(T2) END PROGRAM
编译命令
gfortran net1.f90 -I/home/lsh/WRF/Library/include -L/home/lsh/WRF/Library/lib -lnetcdff -L/home/lsh/WRF/Library/lib -lnetcdf -ldl -lm -lnetcdf -lhdf5_hl -lhdf5 -lz
错误信息
/usr/bin/ld: /tmp/ccrMu0aM.o: in function `MAIN__': net1.f90:(.text+0x184): undefined reference to `check_' /usr/bin/ld: net1.f90:(.text+0x1c7): undefined reference to `check_' /usr/bin/ld: net1.f90:(.text+0x5ca): undefined reference to `check_' /usr/bin/ld: net1.f90:(.text+0x749): undefined reference to `check_'
问题原因与解决方法
- 问题根源:代码中调用的
check子程序并非netCDF库自带函数,它是用于检查netCDF操作返回状态的自定义子程序,你未在代码中定义该子程序,导致链接阶段无法找到对应符号。 - 解决步骤:在源代码中添加
check子程序的定义,示例如下:
SUBROUTINE check(status, message) USE netcdf IMPLICIT NONE INTEGER, INTENT(IN) :: status CHARACTER(LEN=*), INTENT(IN) :: message IF (status /= nf90_noerr) THEN PRINT *, trim(message), " failed:" PRINT *, trim(nf90_strerror(status)) STOP 1 END IF END SUBROUTINE check
将该子程序放在主程序PROGRAM net1之前,重新编译即可解决链接错误。
另外注意:netCDF Fortran接口的维度索引默认从1开始,你代码中start = [0,0,0]和T2(0, dx, dy)的设置可能不符合文件实际维度规则,建议确认目标nc文件的维度起始索引,避免读取数据异常。
内容的提问来源于stack exchange,提问作者gwnu_numerical
相关产品推荐
相关产品推荐

