Problem beim compilieren von Fortran mit C++



  • Hallo zusammen,
    ich habe folgendes Problem:
    ich versuche eine Fortran Subfunction aus einem C++ Programm aufzurufen. An sich ist das kein Problem, aber die Subfunction benutzt einen eigenen (in Fortran definierten) Datentypen, der mit eingebunden wird. In diesem Datentypen werden leider auch Fehler geworfen, und ich denke da steckt das Problem.
    Wenn ich versuche die .o Dateien zu verlinken erhalte ich mehrere "undefined reference to _gfortran_runtime_error" oder "..._os_error" Fehlermeldungen. Ist ja auch klar dass der g++ Compiler die nicht kennt. Aber ist es nicht irgendwie möglich diese Anfragen mit dem Fortran Compiler schon zu befriedigen, also im Aufruf von "f95 -c file.f90" mit einer zusätzlichen Flag oder so?

    Vielleicht liege ich ja auch mit meinen Vermutungen ganz daneben, aber ich wäre für jede Hilfe dankbar.

    Wünsche Guten Rutsch,
    wicked-garlic



  • Ich hab mal das offensichtliche probiert, nämlich die throw error Teile auszukommentieren, aber das hilft auch nicht. Weiß auch nicht warum ich jetzt erst drauf komme 😕
    Der Fehler liegt also offensichtlich wo anders.



  • Der Aufruf von FORTRAN-Funktionen aus eine C/C++-Programm sollte eigentlich kein grosses Problem sein, es müssen nur die Aufrufkonditionen übereinstimmen. Teile einfach mit, welchen Datentyp von FORTRAN es unter C/C++ nicht geben soll. Ich habe lange Zeit FORTRAN / C etc. lustig miteinander vermischt ohne je Probleme damit zu haben. Es gibt aber nicht mehr viele Leute, die auch FORTRAN kennen. Vielleicht reicht es, dem FORTRAN-Compiler mitzuteilen, dass für die Parameterliste (den Stack) C-Konventionen gelten sollen. Ansonsten schreibe die Funktionen nach C um.



  • Hallo,
    erstmal danke für die Antwort.
    "Einfache" kleine Funktionen aufzurufen ist kein Problem. Der Fehler tritt erst auf wenn ich den eigenen Datentypen mit überladenen Operatoren verwende. Scheinbar werden da automatisch diese Error-Funktions-Aufrufe generiert (stehen nicht im Code), und da ich nur compiliere und nicht linke gibt das später einen Fehler. Diese Aufrufe mit Flags zu unterdrücken geht nicht, und dazu-linken natürlich nur wenn man auch den Linker aufruft.
    Die Fortran Funktion nach C/C++ umzuschreiben ist keine Alternative, da der Fortran Code automatisch generiert werden kann und es mehrere verschiedene Testfunktionen mit je ein paar 100 Zeilen Code gibt.



  • kann es sein, daß du nur die libgfortran.a dazulinken mußt?



  • Ich denke schon, aber wie rufe ich denn den Linker auf ohne dass der eine executable erstellt?



  • firehand schrieb:

    Ich denke schon, aber wie rufe ich denn den Linker auf ohne dass der eine executable erstellt?

    nee, ich dachte ganz zum schluß dem g++ noch ein -lgfortran dranzuhängen, damit er beim erstellen der exe datei das dazulinkt.



  • Hm, könnte klappen 🙂 Ich werd's gleich mal ausprobieren und das Ergebnis posten. Ist nur die Frage ob das dann mit den Unterstrichen am Ende der Funktionsnamen ist... aber die kann man ja notfalls unterdrücken 😉
    Bis gleich



  • Also die Fortran lib einzubinden hat zwar die Fehlermeldungen die ich hatte behoben, aber durch Folgefehler ersetzt (es gab also wieder weitere fortran-interne Funktionsaufrufe) 😡
    Die Lösung des Problems: Zum Linken den Fortran Compiler nehmen und mit -lstdc++ die C++ lib einbinden. Ich hatte irgendwie angenommen dass ich mit gcc linken muss weil die main in C++ geschrieben war, aber wenn man bereits eine .o Datei hat geht's auch so 🙂

    Fazit: Beim mischen von Fortran und C++ alle Quelltexte mit dem entsprechenden Compiler kopmilieren und am Ende mit "gfortran *o-Dateien* -lstdc++" linken 👍


Anmelden zum Antworten