2016-08-17 2 views
1

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.

+1

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. –

+0

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

+1

@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. –

Antwort

2

müssen Sie die Bibliothek nach der Objektdatei angeben, die ein Symbol darin definiert verwendet, dh

g++ -o testcpp testcpp.o -L. -ltt -lgfortran 
+0

Das war schnell. Danke vielmals – user1407220

Verwandte Themen