Fortran-Symbol nicht in Ladetabelle (geladenes Symbol in R kann nicht aufgerufen werden)

Ich versuche, eine Fortran-DLL mit Absoft Pro Fortran 13.0.3 (64 Bit) für die Verwendung in R unter Windows 7 (64 Bit) zu erstellen.

Hier ist meine Datei mycalc.f (ein dummes Beispiel, nur um die Funktionalität zu testen):

subroutine mycalcf(a,b,c)
real*8 a,b,c
dll_export mycalcf
c=a+b*b
end

Die Aussagedll_export ist kein Standard, wird aber in einigen Fortran-Compilern verwendet (AFAIK ist auch in Lahey und CVF enthalten, und Intel Fortran hat stattdessen eine Compiler-Direktive). Es teilt dem Compiler lediglich mit, welche Symbole exportiert werden sollen.

Ich kompiliere erfolgreich mit:af90 -m64 -dll -YDLL_NAMES=LCS mycalc.f -o mycalc.dll

Die Option-YDLL_NAMES=LCS Weist den Compiler an, eine Bibliothek mit Kleinbuchstaben zu erstellen, was für R besser erscheint.

Wenn ich rennedumpbin /exports mycalc.dll, Ich finde mycalcf in exportierten Symbolen, in Kleinbuchstaben, ohne vorherigen oder nachfolgenden Unterstrich.

Ab R (64-Bit-Version) funktioniert nun Folgendes:

dyn.load("mycalc.dll")
is.loaded("mycalcf")
.Fortran("mycalcf", a=4, b=5, c=0)

Ich bekomme wie erwartet c = 29 zurück.

ABERWenn ich R neu starte, funktioniert Folgendes nicht (beachte, dass ich nur das entfernt habeis.loaded Prüfung):

dyn.load("mycalc.dll")
.Fortran("mycalcf", a=4, b=5, c=0)

Ich erhalte den Fehler:Fortran symbol name "mycalcf" not in load table.

Jetzt ist meine Frage: Warum ist dieser Test so wichtig?

Zum Vergleich, wenn ich das gleiche mit Gfortran anstelle von Absoft versuche, habe ich überhaupt kein Problem. Ich kompiliere mit:gfortran -m64 -shared -o mycalc2.dll mycalc.f (Nach dem Auskommentieren der Anweisung dll_export, die von gfortran weder benötigt noch erkannt wird). Dann in R:

dyn.load("mycalc2.dll")
.Fortran("mycalcf", a=4, b=5, c=0)

Und ich bekomme c = 29, kein Fehler.

Ich vermute, dass der gcc-Linker etwas tut, das nicht automatisch vom Absoft-Linker ausgeführt wird (eigentlich ist es die link.exe von Microsoft). Aber ich habe keine Ahnung, woran es liegen kann.

Jede Idee ist willkommen!

Ok, Lösung nach einer guten Frage von Vladimir F (siehe Kommentare). Eigentlich muss man Unterstriche an Symbolnamen anhängen. Da es keine Möglichkeit gibt, dies per Compiler-Option zu tun, braucht manCDEC$ Richtlinien (vglHP oderIntel Dokumentation).

Hier ist es einfach:

      subroutine mycalcf(a,b,c)
CDEC$ attributes alias:'mycalcf_' :: mycalcf
      real*8 a,b,c
      dll_export mycalcf
      c=a+b*b
      end

Zweite Lösung, vonAbsoft-Forum: Eigentlich habe ich mich von Anfang an geirrt. Im Gegensatz zu dem, was ich dachte, muss man die dll_export-Anweisung nicht verwenden, und sie hat sogar das Problem eingeführt: Ohne sie hängt der Compiler Unterstriche an. Alle Symbole werden standardmäßig wie in Gfortran exportiert. Der richtige Code lautet also einfach:

      subroutine mycalcf(a,b,c)
      real*8 a,b,c
      c=a+b*b
      end

Es ist nicht einmal erforderlich, Symbole in Kleinbuchstaben abzurufen. Es sind auch die Standardeinstellungen.

Es bleibt jedoch eine Frage: Funktioniert das R?.Fortran Füge immer einen Unterstrich hinzu (gibt es eine Möglichkeit, es nicht anzudeuten?), und wenn es immer hinzugefügt wird, warum funktioniert der Anruf, wennis.loaded wird vorher angerufen? R scheint hier etwas Seltsames zu tun. Ich habe versucht zu verfolgenis.loaded in R Quellcode (bis zudo_isloaded imsrc\main\dotcode.c), umsonst.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage