我试图通过执行“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程序员,实际上我通常只会发现自己在这些“传统”应用程序中争吵 。
修改user_build_options
以删除cpp
的-C
选项,并为jasper
和netcdf
(在我的情况下是标准位置)设置合适的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
将iargc
所有external
声明转换为intrinsic
find . -name '*.F' -execdir sed -i 's/external :: iargc/intrinsic :: iargc/' {} \;
( intrinsic
关键字可能是多余的 – 我没有尝试只是删除external
。)
编辑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)
建立顶级软件
/hrldas-v3.4.1$ make
构建Utility_programs
软件
/hrldas-v3.4.1$ cd Utility_programs /hrldas-v3.4.1/Utility_programs$ make
测试可执行文件
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
(尽管你似乎没有使用它) 也许你需要玩一些可能的选择,我没有尝试过。