C++ Fortran Problem
-
Hallo Forenuser,
ich habe ein heikles Problem das nach einer Lösung schreit. Ich bin selbst kein großer C++-Programierer um genau zu sein habe ich damit vor 5 min. angefangen. Ich selbst nutze nur meist C-Programme schreibe sie aber nicht selbst. Nun zu meinem Problem, ich hoffe ich beschreibe es nicht zu kompliziert. Ich habe ein C-Programm das eine Schnittstelle zu einem Fortran-Programm darstellt bzw. die Hülle zu dem Fortran Kern :).
Das Programm nennt sich RandomForest. Das C-Program musste ich so umschreiben das es ohne zusätzliche Headerdateien auskommt die nicht Freecode sind.
Das habe ich getan und er wirft mir immer wieder die Fehlermeldungen:
undefined reference tocreateclass_' undefined reference to
zerm_'
undefined reference tozerv_' undefined reference to
zerv_'
undefined reference to `prep_' ...etc. auswobei diese Reference auf eine entsprechende Fortran-Subroutine sein sollte. Das Fortran-Programm ist da, vielleicht am falschen Ort aber da. Die Subroutinen entsprechen dem C-Aufruf.
Hoffe euch kommt ein für mich rettender Einfall. Fals ihr den Code benötigt würde ich ihn auch hier posten ist nur ne ganze Ecke darum habe ich das nicht gleich gemacht.
Ich bedanke mich im voraus.
Mit freundlichen Grüßen
Amael
-
Bist du sicher, dass du die Routinen auch einlinkst?
-
Hallo Bashar
Jein bin mir unsicher denke das das Einlinken das Problem ist die von mir genutzen Routinen sind nur selbstbeschreibend und sehr komplex, also weiß ich es nicht genau.
Die folgenden Zeilen stehen in der dazugehörigen Headerdatei und in der C Datei erfolgt der Aufruf mit F77_CALL(Zerv)...etc. Die Fortrandatei befindet sich im selben Verzeichnis. Die Soubroutinennamen im Fortran sind identisch mit den F77_CALL aufrufen.extern void F77_NAME(createclass)(double *, int *, int *, int *, int *,
double *, double *, double *, int *, int *);
extern void F77_NAME(zerm)(int *, int *, int *);
extern void F77_NAME(zermd)(double *, int *, int *);
extern void F77_NAME(zerv)(int *, int *);
extern void F77_NAME(zervr)(double *, int *);Ich hoffe das hilft bei der Klärung.
DankeMit freundlich Grüßen
Amael
-
Wenn du dir unsicher bist, werden sie wahrscheinlich nicht gelinkt. Nur im selben Verzeichnis zu liegen reicht nicht aus. Welchen Compiler benutzt du, wie sieht dein Compileraufruf aus?
Mal den gcc angenommen, würde das ungefähr so aussehen:
g77 -c fortran1.f
g77 -c fortran2.f
gcc -c cee1.c
...
gcc fortan1.o fortran2.o cee1.o
-
Ich benutze Force2.0 für die Fortran-Programme und DevC++ für die C Programme. Deine Antwort hat mich auf die Idee gebracht das alles mal im DOS-Prompt auszuprobieren da die Compiler auf diese beiden Dateien(g77, gcc) zurückgreifen nachdem beide die .o Datei erstellt hatten, hatte ich sie kombiniert (was ich vorher nicht gemacht habe) kompiliert und meine Fehlermeldungen auf 3 reduziert.
C:\Dev-C++\Bin>gcc rf.o rfsub.o
rf.o(.text+0x8f0):rf.c: undefined reference toGetRNGstate' rf.o(.text+0x13b9):rf.c: undefined reference to
PutRNGstate'
..\lib\gcc-lib\i386-mingw32msvc\2.95.2\..\..\..\libmingw32.a(main.o)(.text+0x8e)
: undefined reference to `WinMain@16'bei den ersten beiden würde mir noch was einfallen, ich denke da greift er auf eine Routine zurück die ich nocht nicht implementiert habe aber der letzte Fehler sagt mir nicht.
Vielleicht fällt Dir noch was ein.
Ich danke dir erstmal für die Minimierung meiner Fehler.
Amael
-
Die letzte deutet darauf hin, dass du DevC++ gesagt hast, du willst ein Windows-Programm erstellen, aber keine WinMain-Funktion hast. Du musst das Projekt als Konsolenanwendung anlegen, dann ist die main-Funktion der Einsprungpunkt.
Glaube ich jedenfalls, ich benutze kein DevC++.