2017-06-29 1 views
0

Ich versuche ein Programm zu kompilieren und ich muss die Pfade zu den NETCDF inc und lib Verzeichnissen im Makefile setzen sowie die gfortran und c Compiler Einstellungen setzen. Die Variablen wurden bereits wie unten gezeigt benannt, sie haben mir lediglich gesagt, dass ich die Pfade/Optionen bearbeiten soll, die ich versucht habe. Hier ist, was ich für meine netcdf inc und lib, sowie die hdf5:Syntax zum Setzen von Pfaden zu Bibliothek und Compiler in 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 

Beachten Sie, dass die NETCDFLIB auf einer Linie auf meine Datei ist, und die Pfade der Variablen sind korrekt, aber die Syntax kann nicht sein.

Weiter für die Fortran und C-Compiler Informationen habe ich die folgenden:

FC = gfortran -m64 -g -O0 -ffixed-line-length-132 -Wunused -Wuninitialized 
CC = gcc 
CFLAGS = -m64 -c -g -I. -DLONG32 -DUNDERSCORE -DLITTLE -Wunused - 
Wuninitialized 

Schließlich, wenn ich das Programm ausführen ich zum ersten Mal eine Reihe von Warnungen erhalten wie:

oban_namelist.f90:495.29: 

real    :: flt 
         1 
Warning: Unused variable 'flt' declared at (1) 

Gefolgt von eine Reihe von undefinierten Referenzfehlern wie:

Der Fehler sollte nicht sein diese oban.o Funktion, da ich sie nicht geschrieben habe. Die einzigen Dinge, die ich in dem oben genannten Programm für den netcdf-Pfad und die gfortran/c-Informationen bearbeitet habe, und so denke ich, liegt der Fehler da. Das ist meine erste Frage hier, also wenn ich etwas verpasst habe, könntest du gerne fragen. Was kann ich versuchen?

Edit: Auf Wunsch ist dies das gesamte Makefile, das ich verwende. Außerdem gebe ich einfach 'make' ein, um es gemäß den Anweisungen in der README-Datei zu kompilieren.

# 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

Der 'undefinierte Verweis auf '__netcdf_MOD_nf90_strerror' ist ein Linkerfehler. (das 'f90' deutet darauf hin, dass es Fortran ist) Es sagt dir, es weiß nicht, was' __netcdf_MOD_nf90_strerror' ist. Möglicherweise, weil Sie einen Header-Include (oder einen "-I/path/to/it") verpasst haben oder er nicht deklariert wurde, bevor er verwendet wird. Veröffentlichen Sie das gesamte Makefile zusammen mit einer Kompilierungszeichenfolge, mit der Sie Ihren Code erfolgreich erstellen können (falls vorhanden). So können wir eingrenzen, wo das Problem liegt. –

+0

Haben Sie immer noch eine Kopie von der Originalzeile, die Sie zum Vergleich geändert haben? Ohne zu wissen, wie man kompiliert, was man versucht zu kompilieren, macht es die Antwort sehr schwierig. Die 'oban.o' Bibliothek kann keine Deklaration für' __netcdf_MOD_nf90_strerror' sehen. Haben Sie die Reihenfolge der Teile der Variablen im Makefile geändert? Es sucht nach etwas, das möglicherweise angegeben werden muss, bevor "oban.o" in der Kompilierzeichenfolge erreicht wird. –

+0

Ich habe das Makefile oben hinzugefügt.Auch der ursprüngliche Code war wie folgt mit Leerzeichen für mich zu bearbeiten: NETCDFINC = -I///netcdf4-64/enthalten NETCDFLIB = -L///netcdf4-64/lib-lm-lnetcdf -L///hdf5/lib - lhdf5_hl -lhdf5 lz und FC = gfortran -m64 -G -O0 -Wl, -stack_size, 10000000 -ffixed-line- längen 132 -Wunused -Wuninitialized CC = gcc CFLAGS- = -m64 -c -g -I. -DLONG32 -DUNDERSCORE -DLITTLE - Wunused -Initialisiert Zum kompilieren gebe ich einfach make ein, was die Instruktionen zu tun haben. Ich habe die Reihenfolge, in der sie aufgerufen werden, nicht geändert. –

Antwort

0

wurde das Problem durch Bearbeiten der NETCDFLIB Zeile wie folgt gelöst:

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 

Im Grunde nur in den ich brauchte:

-lnetcdff -lnetcdf -lm 

Diese für den Compiler erlaubt den Zugriff auf die zu bekommen Bibliotheken benötigt, die ursprünglich undefiniert waren.

Verwandte Themen