2017-06-29 797 views
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 
+0

'__netcdf_MOD_nf90_strerror'的未定义引用是链接器错误。 ('f90'表明它与Fortran相关)它告诉你它不知道什么是'__netcdf_MOD_nf90_strerror'。可能是因为你错过了一个头文件include(或者'-I/path/to/it'),或者它在使用前没有被声明。将整个Makefile与一个可用于成功构建代码的编译字符串一起发布(如果有的话)。这将使我们能够缩小问题所在。 –

+0

你还有一份你改变过的原始文件的副本吗?不知道如何编译你正在编译的内容,这使得回答非常困难。 'oban.o'库无法看到'__netcdf_MOD_nf90_strerror'的声明。你是否改变了Makefile中变量的部分顺序?它正在寻找可能需要在编译字符串中达到'oban.o'之前指定的内容。 –

+0

我加了上面的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,这就是说明所要做的。 –

回答

0

问题是由编辑NETCDFLIB线如下解决它需要的库最初是未定义的。