Fortran DLL aus C++



  • Hallo Entwickler,
    ich würde gerne wissen, wie ich eine FORTRAN-DLL aus C++ aufrufe. Die FORTRAN-DLL sieht so aus:

    subroutine FORTRAN_A_plus_B_in_C(A, B, C, A_, B_, C_)
    INTEGER A,B,C
    INTEGER(4) A_(2)
    INTEGER(4) B_(2)
    INTEGER(4) C_(2)
    C=A+B;
    C_(1)=A_(1)+B_(1)
    C_(2)=A_(2)+B_(2)
    end subroutine FORTRAN_A_plus_B_in_C

    Nach dem Compilieren, habe ich diese in den DEBUG-Ordner des aufrufenden C++-Programmes kopiert. Die FORTRAN-DLL heißt "FORTRAN_DLL.dll".

    Das aufrufende C++-Programm sieht so aus:

    /* Main program written in C++ that calls a Fortran DLL */
    #include <stdio.h>
    #include <string.h>

    extern "C" __declspec(dllimport) void _stdcall FORTRAN_A_plus_B_in_C(
    int *A,
    int *B,
    int *C,
    int A_[2],
    int B_[2],
    int C_[2]);

    void main (int argc, char *argv[])
    {
    int *A=new int;
    int *B=new int;
    int *C=new int;
    int A_[2];
    int B_[2];
    int C_[2];
    FORTRAN_A_plus_B_in_C(A,B,C, A_, B_, C_);
    }

    Leider erhalte ich beim Compilieren folgende Fehlermeldungen:
    1>Call_Fortran_Dll.obj : error LNK2019: unresolved external symbol __imp__FORTRAN_A_plus_B_in_C@24 referenced in function _main
    1>C:\Data\My_projects\Call_Fortran_Dll\Debug\Call_Fortran_Dll.exe : fatal error LNK1120: 1 unresolved externals

    Habe ich irgendwelche zusätzlichen Einstellungen im aufrufenden C++-Programm vergessen? Ich kenne das vom Aufruf eine C++-DLL, daß zunächst die Header-Datei der DLL mit #include eingebunden werden muß und zusätzlich die lib-Datei dem aufrufenden Projekt hinzugefügt werden muß. Aber beides existiert ja nicht für die erstellte FORTRAN-DLL.

    Vielen Dank für Eure Antworten.

    Gruß,
    Peter
    (KonPe@gmx.de)


  • Mod

    edit: Was hier stand war falsch.


  • Mod

    So, jetzt aber richtig:
    Das Symbol in der Fortranobjektdatei sollte "fortran_a_plus_b_in_c_" heißen. Damit funktioniert es bei mir. Wobei ich zum Testen jedoch keine dll benutzt habe, aber das sollte keinen Unterschied machen.

    Ob das Programm dann auch selber funktioniert habe ich nicht getestet. Bist du sicher, dass die Arrayübergabe so richtig ist?

    P.S.: Und es gibt auch so etwas wie einen Adressoperator in C++, du brauchst nicht zu new zu greifen. Mach den Funktionaufruf doch lieber so:

    int foo;
    bar(&foo);
    


  • Auf die Schnelle gesucht:
    http://www.physiology.wisc.edu/comp/docs/notes/not017.html

    ob es da compilerspezifische Besonderheiten gibt? -> möglich

    Was zu Problemen führen kann wie Sepp andeutete, C oder C++ arbeiten casesensitiv, fortran nicht.

    Ich hoffe das die Beispiele weiterhelfen.

    MfG f.-th.



  • Es muss sichergestellt sein, dass die FORTRAN-DLL den Aufrufkonventionen von C entspricht --> FORTRAN-Doku?
    Wenn du eine C-kompatible DLL hast, erzeugst du mit der DOS-Utility implib eine Import-Bibliothek für die C-Anwendung und bindest diese mit LoadLibrary ein. Kann ich leider nicht testen, da mein MS-FORTRAN-Compiler unter Vista32 nicht laufen will.



  • Mit welchen Compilern arbeitest du?

    Als du den C++ Quelltext compilieren wolltest, hast du dem Linker den Namen der DLL mitgeteilt?

    MfG f.-th.


Anmelden zum Antworten