Ich erhalte Probleme beim Aufrufen einer FORTRAN-Subroutine aus C++, wenn die Funktion in eine mit "ar rcs" erstellte Bibliothek gestellt wird.Probleme beim Aufrufen der FORTRAN-Bibliothek von C++
Die FORTRAN-Routine (tt.f90) ist:
Module A
contains
Subroutine SubIF2(ii)
Integer*8, Intent(In) :: ii
write(*,*) "hello", ii
End Subroutine SubIF2
End Module A
eine C++ Anrufers (testcpp.cpp) -Code
#include <iostream>
using namespace std;
extern"C" {
void __a_MOD_subif2(long long int *ii);
}
main(){
long long int ii=5;
__a_MOD_subif2(&ii);
return 0;
}
ist A Fortran Anrufers (testf.f90) -Code ist
Program test
use A
integer*8 :: i=1
call SubIF2(i)
End Program test
die Make-Datei ist
p=/PathToMyWorkDirectory
all:
gfortran -c tt.f90
ar rcs libtt.a tt.o
g++ -c testcpp.cpp
gfortran -c testf.f90
-gfortran -o testf90 testf.o tt.a
-g++ tt.o testcpp.o -o testcpp -lgfortran
-g++ -L$(p) -ltt testcpp.o -o testcpp -lgfortran
clean:
-rm *.o *.mod
-rm testf90
-rm testcpp
Während die "gfortran -o testf90 testf.o tt.a" und "g ++ tt.o testcpp.o -o testcpp -lgfortran" eine funktionierende ausführbare Datei ergeben, "g ++ -L $ (p) -ltt testcpp. o -o testcpp -lgfortran“stürzt
testcpp.o: In function `main':
testcpp.cpp:(.text+0x18): undefined reference to `__a_MOD_subif2'
collect2: error: ld returned 1 exit status
Seit Verknüpfung Arbeiten für die fortran ausführbare Datei, kann ich nichts falsch in der Bibliothek Schöpfung sehen kann.
Irgendeine Idee was ich hier vermisse ??
Vielen Dank.
Hinweis: Die abschließende Fortran-Funktion wird binär sein, daher ist die Anpassung des Fortran-Codes (z. B. iso_c_binding) keine Option.
Hinweis: Wenn Sie das Unterprogramm aus der Fortran-Modul nehmen Sie nicht die Compiler-spezifischen brauchen '.mod' Datei noch mehr, und Sie können direkt die Unterroutine ohne das Präfix' __a_MOD_' aufrufen, das nicht portierbar ist. Meiner Meinung nach sollten Fortran-Bibliotheken eine modulfreie Schnittstelle aufweisen, die den Benutzern die Arbeit erleichtert. –
Es gibt einige keine abschließenden Unterstreichungsschalter, die nützlich sein können. Oder Sie können einen nachgestellten Unterstrich in die c einfügen. Auch wenn die f90-Routine öffentlich ist oder ein! DEC $ ATTRIBUTES ALIAS: subif2 :: subif2 verwendet, dann kann das helfen. – Holmz
@Holmz 'bind (C, name =" ")' ist viel besser als die alten DEC ALIAS. Und noch wichtiger ist, die Frage betrifft Gfortran und Gfortran kümmert sich überhaupt nicht um "DEC ATRTRIBUTES". Kein Wunder, es ist nicht DEC, sondern GNU. –