如何解决对`iargc_'错误的未定义引用?

我试图通过执行“make”命令来执行名为“gribextract”的程序。

我得到一个错误


gfortran -o hrldas_extract_point -fconvert=big-endian -g -I. \ hrldas_extract_point.o arguments_module.o module_date_utilities.o llxy_generic.o lccone.o \ -L/home/Admin/Workstation/NETCDF413/lib -lnetcdff -lnetcdf arguments_module.o: In function `initialize': /home/Admin/Workstation/Hrldas/Utility_programs/arguments_module.f90:400: undefined reference to `iargc_' collect2: error: ld returned 1 exit status make: *** [hrldas_extract_point] Error 1 

如何解决这个错误。 以下是我的用户构build选项

 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ COMPILERF90 = gfortran FREESOURCE = -ffree-form -ffree-line-length-none -cpp F90FLAGS = -fconvert=big-endian -g MODFLAG = -I LDFLAGS = CPP = cpp CPPFLAGS = -C -P -traditional -D_GFORTRAN_ # -D_HRLDAS_URBAN_ LIBS = LIBJASPER = -ljpeg -L/home/Admin/Workstation/Hrldas/Jasper/lib -ljasper INCJASPER = -I/home/Admin/Workstation/Hrldas/Jasper/include NETCDFMOD = -I/home/Admin/Workstation/NETCDF413/include NETCDFLIB = -L/home/Admin/Workstation/NETCDF413/lib -lnetcdff -lnetcdf HDF5LIB = -L/home/Admin/Workstation/HDF5-Ver-1.8.14/lib -lhdf5_hl -lhdf5 -lm -lcurl NETCDF4_COMPRESS= YES BZIP2 = YES BZIP2_LIB = -lbz2 BZIP2_INCLUDE = -I/usr/include RM = rm -f CC = cc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

FWIW这里是我如何能够在Ubuntu 14.04 x86_64上从hrldas-v3.4.1 tarball构建gribextract免责声明:我不是一个Fortran程序员,实际上我通常只会发现自己在这些“传统”应用程序中争吵

  1. 修改user_build_options以删除cpp-C选项,并为jaspernetcdf (在我的情况下是标准位置)设置合适的include和lib路径。 注意:只有在使用gfortran> 4.8.x时,才能删除-C

     COMPILERF90 = gfortran FREESOURCE = -ffree-form -ffree-line-length-none F90FLAGS = -fconvert=big-endian # -g MODFLAG = -I LDFLAGS = CPP = cpp CPPFLAGS = -P -traditional -D_GFORTRAN_ # -D_HRLDAS_URBAN_ LIBS = LIBJASPER = -ljpeg -ljasper INCJASPER = -I/usr/include NETCDFMOD = -I/usr/include NETCDFLIB = -L/usr/lib -lnetcdff -lnetcdf HDF5LIB = -L/usr/lib -lhdf5_hl -lhdf5 -lm -lcurl NETCDF4_COMPRESS = YES BZIP2 = YES BZIP2_LIB = -lbz2 BZIP2_INCLUDE = -I/usr/include RM = rm -f CC = cc 
  2. iargc所有external声明转换为intrinsic

     find . -name '*.F' -execdir sed -i 's/external :: iargc/intrinsic :: iargc/' {} \; 

    intrinsic关键字可能是多余的 – 我没有尝试只是删除external 。)

  3. 编辑Utility_programs/modify_wrfinput.F以解决有关将循环变量i作为intent(out)参数传递给nf90_def_dim函数的错误: diff

     /hrldas-v3.4.1$ diff Utility_programs/modify_wrfinput.F{.bak,} 387c387 < integer :: iret, i, j --- > integer :: iret, i, j, iout 410c410,411 < iret = nf90_def_dim (copy_ncid, trim(name), lendd, i) --- > iout = i > iret = nf90_def_dim (copy_ncid, trim(name), lendd, iout) 
  4. 建立顶级软件

     /hrldas-v3.4.1$ make 
  5. 构建Utility_programs软件

     /hrldas-v3.4.1$ cd Utility_programs /hrldas-v3.4.1/Utility_programs$ make 
  6. 测试可执行文件

     hrldas-v3.4.1/Utility_programs$ ./gribextract -h ************************************************************************** ./gribextract -- extracts specified fields from a GRIB (Edition 1 or Edition 2) file. <snip> 

我想你需要把你的程序和gfortran库联系起来。 添加-lgfortran到你的链接参数。

UPD :似乎iargc是以不同的方式处理的,这取决于它在程序和程序编译选项中的使用方式。 这里有两个有用的链接: https : //gcc.gnu.org/ml/fortran/2007-01/msg00236.html和https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 20248

一些总结:

  • 你不应该在你的代码中包含extern iargc
  • 你不应该使用-std=f95 (尽管你似乎没有使用它)

也许你需要玩一些可能的选择,我没有尝试过。