【发布时间】:2017-12-03 17:52:00
【问题描述】:
我正在尝试编译一个程序,我必须在 Makefile 中设置 NETCDF inc 和 lib 目录的路径,并设置 gfortran 和 c 编译器设置。变量已经命名如下所示,它只是告诉我编辑我尝试过的路径/选项。这是我的 netcdf inc 和 lib 以及 hdf5 的内容:
NETCDFINC = -I$(NETCDFF_INCDIR) -I$(NETCDFC_INCDIR)
NETCDFLIB = -Wl,-rpath=$(NETCDFF_LIBDIR) -L$(NETCDFF_LIBDIR) -Wl,-
rpath=$(NETCDFC_LIBDIR) -L$(NETCDFC_LIBDIR) -Wl,-rpath=$(HDF5_LIBDIR) -
L$(HDF5_LIBDIR) -lhdf5_hl -lhdf5 -lz
请注意,NETCDFLIB 在我的文件中的一行,并且变量的路径是正确的,但语法可能不正确。
对于 fortran 和 c 编译器信息,我有以下内容:
FC = gfortran -m64 -g -O0 -ffixed-line-length-132 -Wunused -Wuninitialized
CC = gcc
CFLAGS = -m64 -c -g -I. -DLONG32 -DUNDERSCORE -DLITTLE -Wunused -
Wuninitialized
最后,当我运行程序时,我首先收到一堆警告,例如:
oban_namelist.f90:495.29:
real :: flt
1
Warning: Unused variable 'flt' declared at (1)
后面跟着一堆未定义的引用错误如:
oban.o: In function `check':
/uufs/chpc.utah.edu/common/home/zpu-
group3/dhodges/DART/data/radar/opaws/oban.f90:1902: undefined reference to
`__netcdf_MOD_nf90_strerror'
错误不应该出现在这个 oban.o 函数中,因为它不是我写的。我在上面列出的程序中为 netcdf 路径和 gfortran/c 信息编辑了唯一的东西,所以我认为错误就在那里。这是我在这里的第一个问题,所以如果我错过了您需要的任何内容,请随时提出。我可以尝试什么?
编辑:根据要求,这是我正在使用的整个 makefile。另外,我只需键入“make”即可按照 README 文件中的说明进行编译。
# Makefile for creating the OPAWS analysis software
#
# Rev: 02/05/10 LJW
# 12/05/10 DCD
# 02/11/11 LJW
#
# netCDF4 libs - you need to fill in the blanks
NETCDFINC = -I$(NETCDFF_INCDIR) -I$(NETCDFC_INCDIR)
NETCDFLIB = -Wl,-rpath=$(NETCDFF_LIBDIR) -L$(NETCDFF_LIBDIR) -Wl,-rpath=$(NETCDFC_LIBDIR) -L$(NETCDFC_LIBDIR) -Wl,-rpath=$(HDF5_LIBDIR) -
L$(HDF5_LIBDIR) -lhdf5_hl -lhdf5 -lz
# Fortran and C compiler information - various configurations are setup, try and find one close
#=====>> Gfortran
#
FC = gfortran -m64 -g -O0 -ffixed-line-length-132 -Wunused -Wuninitialized
CC = gcc
CFLAGS = -m64 -c -g -I. -DLONG32 -DUNDERSCORE -DLITTLE -Wunused -Wuninitialized
# Leave this stuff alone
EXEC = x.oban
EXECcs = x.clutter_stats
EXECmd = mosaic_2_dart
OBJS = DART.o oban_module.o dict_module.o oban_namelist.o derived_types.o util.o fileio.o read_dorade.o binio.o v5d.o
OBJScs = DART.o dict_module.o oban_namelist.o derived_types.o fileio.o util.o read_dorade.o binio.o v5d.o
OBJSmd = DART.o dict_module.o oban_namelist.o derived_types.o fileio.o util.o read_dorade.o binio.o v5d.o
default: $(EXEC) $(EXECcs) $(EXECmd)
$(EXEC): $(OBJS) oban.o
$(FC) $(OPT) -o $(EXEC) oban.o $(OBJS) $(NETCDFLIB)
$(EXECcs): $(OBJScs) clutter_stats.o
$(FC) $(OPT) -o $(EXECcs) clutter_stats.o $(OBJScs) $(NETCDFLIB)
$(EXECmd): $(OBJSmd) mosaic_2_dart.o
$(FC) $(OPT) -o $(EXECmd) mosaic_2_dart.o $(OBJSmd) $(NETCDFLIB)
clean:
rm $(EXEC) oban.o $(OBJS) $(EXECcs) clutter_stats.o $(OBJScs) $(EXECmd) mosaic_2_dart.o $(OBJSmd) *.mod ncgen.input *.pyc sweep_file_list.txt
# Individual compilation instructions
oban.o: oban.f90 structures.inc opaws.inc DART.o
$(FC) $(OPT) -c $(NETCDFINC) oban.f90
clutter_stats.o: clutter_stats.f90 opaws.inc
$(FC) $(OPT) -c $(NETCDFINC) clutter_stats.f90
mosaic_2_dart.o: mosaic_2_dart.f90 opaws.inc
$(FC) $(OPT) -c $(NETCDFINC) mosaic_2_dart.f90
oban_module.o: oban_module.f90 derived_types.o opaws.inc
$(FC) $(OPT) -c oban_module.f90
read_dorade.o: read_dorade.c read_dorade.h
$(CC) $(CFLAGS) -c read_dorade.c
fileio.o: fileio.f90
$(FC) $(OPT) $(NETCDFINC) -c fileio.f90
util.o: util.f opaws.inc structures.inc
$(FC) $(OPT) -c util.f
DART.o: DART.f
$(FC) $(OPT) -c DART.f
derived_types.o: derived_types.f90
$(FC) $(OPT) -c derived_types.f90
oban_namelist.o: oban_namelist.f90 opaws.inc
$(FC) $(OPT) -c oban_namelist.f90
dict_module.o: dict_module.f90
$(FC) $(OPT) -c dict_module.f90
binio.o: binio.c
$(CC) $(CFLAGS) binio.c -o binio.o
v5d.o: v5d.c
$(CC) $(CFLAGS) v5d.c -o v5d.o
【问题讨论】:
-
undefined reference to '__netcdf_MOD_nf90_strerror'是链接器错误。 (f90表明它与 fortran 相关)它告诉你它不知道__netcdf_MOD_nf90_strerror是什么。可能是因为您错过了头文件包含(或-I/path/to/it),或者它只是在使用之前没有声明。发布整个 Makefile 以及可用于成功构建代码的编译字符串(如果有的话)。这将使我们能够缩小问题所在。 -
您是否还有一份您更改后要比较的原始行的副本?在不知道如何编译您要编译的内容的情况下,这会使回答变得非常困难。
oban.o库看不到__netcdf_MOD_nf90_strerror的声明。您是否更改了 Makefile 中任一变量的部分顺序?它正在寻找在您的编译字符串中到达oban.o之前可能需要指定的内容。 -
我在上面添加了makefile。原始代码如下,我可以编辑空白:NETCDFINC = -I/ / /netcdf4-64/include NETCDFLIB = -L/ / /netcdf4-64/lib -lm -lnetcdf -L/ / /hdf5/lib -lhdf5_hl -lhdf5 -lz 和 FC = gfortran -m64 -g -O0 -Wl,-stack_size,10000000 -fixed-line-length-132 -Wunused -Wuninitialized CC = gcc CFLAGS = -m64 -c -g -I。 -DLONG32 -DUNDERSCORE -DLITTLE - Wunused -Wuninitialized 要编译,我只需键入 make,这就是指令所说的。我没有更改调用它们的顺序。
-
@DavidC.Rankin,以下是自述文件中的说明,如果这有助于了解:“所需软件:1. Fortran 编译器 (gfortran/Intel) 2. CC 编译器(gcc 很好) 3. 使用 fortran (3 或 4) BUILD 指令安装 netCDF3/4 1. 编辑 Makefile 以放入您的 fortran 和 C 编译器。提供了两个示例。 2. 设置到 netCDF 库的正确链接。fortran 需要包含使用netcdf模块接口的目录。 3. 输入“make”进行编译。构建了两个可执行文件:x.oban和x.clutter_stats
-
从您的错误来看,“* 2. 设置正确的 netCDF 库链接。fortran 需要包含目录才能使用 netcdf 模块接口。*”不知道
__netcdf_MOD_nf90_strerror是什么。您确定它安装了正确的链接,以便-I$(NETCDFF_INCDIR)和-L$(NETCDFF_LIBDIR)正确解析。我不会编译很多 fortran,是否需要任何-lcdf...库?
标签: c makefile environment gfortran undefined-reference