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_CNach 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 externalsHabe 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)
-
edit: Was hier stand war falsch.
-
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.htmlob 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.