0
我想编译一个程序,我必须在Makefile中设置NETCDF inc和lib目录的路径以及设置gfortran和c编译器设置。这些变量已经被命名为如下所示,它只是告诉我编辑我试图做的路径/选项。以下是我为我的NetCDF INC和lib,还有HDF5:在makefile中设置库和编译器的路径的语法
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文件中的说明进行编译。
I edited the NETCDFLIB line as follows and it works: NETCDFLIB = -Wl,-
rpath=$(NETCDFF_LIBDIR) -L$(NETCDFF_LIBDIR) -Wl,-rpath=$(NETCDFC_LIBDIR) -
L$(NETCDFC_LIBDIR) -lnetcdff -lnetcdf -lm -Wl,-rpath=$(HDF5_LIBDIR) -
L$(HDF5_LIBDIR) -lhdf5_hl -lhdf5 -lz
基本上,我只需要添加:
-lnetcdff -lnetcdf -lm
这使编译器去访问
# 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
'__netcdf_MOD_nf90_strerror'的未定义引用是链接器错误。 ('f90'表明它与Fortran相关)它告诉你它不知道什么是'__netcdf_MOD_nf90_strerror'。可能是因为你错过了一个头文件include(或者'-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,千万-ffixed设备 - 长度-132 -Wunused -Wuninitialized CC = GCC CFLAGS = -m64 -c -g -I。 -DLONG32 -DUNDERSCORE -DLITTLE - Wunused -Wuninitialized 为了编译,我只需键入make,这就是说明所要做的。 –