2017-06-29 796 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線如下解決它需要的庫最初是未定義的。