Symbol Fortran nie jest w tabeli ładowania (nie można wywołać załadowanego symbolu w R)

Próbuję zbudować bibliotekę Fortran DLL z Absoft Pro Fortran 13.0.3, 64 bity, do użytku w R, na Windows 7 64 bity.

Oto mój plik mycalc.f (to głupi przykład, aby przetestować funkcjonalność):

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

Wyrokdll_export nie jest standardem, ale można go znaleźć w niektórych kompilatorach Fortran (AFAIK znajduje się również w Lahey, a CVF i Intel Fortran zamiast tego mają dyrektywę kompilatora). Mówi tylko kompilatorowi, które symbole mają zostać wyeksportowane.

Kompiluję się z:af90 -m64 -dll -YDLL_NAMES=LCS mycalc.f -o mycalc.dll

Opcja-YDLL_NAMES=LCS nakazuje kompilatorowi zbudowanie biblioteki z małymi symbolami, co wydaje się lepsze dla R.

Jeśli ucieknędumpbin /exports mycalc.dll, Mogę znaleźć mycalcf w eksportowanych symbolach, małymi literami, bez żadnego podkreślenia przed lub po.

Teraz z R (wersja 64-bitowa) następujące prace:

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

Zgodnie z oczekiwaniami otrzymuję c = 29 po powrocie.

ALE, jeśli ponownie uruchomię R, poniższe czynności nie działają (zauważ, że usunąłem tylkois.loaded test):

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

Dostaję błąd:Fortran symbol name "mycalcf" not in load table.

Teraz moje pytanie brzmi: dlaczego ten test jest tak ważny?

Dla porównania, gdy próbuję tego samego z gfortranem zamiast Absoftem, nie mam żadnego problemu. Kompiluję z:gfortran -m64 -shared -o mycalc2.dll mycalc.f (po skomentowaniu instrukcji dll_export, która nie jest potrzebna, ani nawet rozpoznawana przez gfortran). Następnie w R:

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

I dostaję c = 29, bez błędu.

Podejrzewam, że coś, co robi linker gcc, nie jest wykonywane automatycznie przez linker Absoft (właściwie to link.exe Microsoftu). Ale nie mam pojęcia, co to może być.

Każdy pomysł jest mile widziany!

Ok, rozwiązanie po dobrym pytaniu Vladimira F (patrz komentarze). Właściwie należy dołączyć podkreślniki do nazw symboli. Ponieważ nie ma sposobu, aby to zrobić za pomocą opcji kompilatora, trzebaCDEC$ dyrektywy (patrzHP lubIntel dokumentacja).

Oto po prostu:

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

Drugie rozwiązanie, odForum Absoft: właściwie myliłem się od samego początku. Wbrew temu, co myślałem, nie trzeba używać instrukcji dll_export, a nawet wprowadził problem: bez niego kompilator dołącza podkreślenia. Wszystkie symbole są eksportowane domyślnie, tak jak w gfortran. Więc poprawny kod to po prostu:

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

Nie ma nawet potrzeby, aby uzyskać małe symbole, to także domyślne.

Pozostaje jednak jedno pytanie: czy funkcja R.Fortran zawsze dodawaj podkreślenie (czy istnieje sposób, aby tego nie robić?), a jeśli zawsze jest dodawany, dlaczego wywołanie działa, gdyis.loaded nazywa się wcześniej? R wydaje się robić tutaj coś dziwnego. Próbowałem śledzićis.loaded w kodzie źródłowym R (dodo_isloaded wsrc\main\dotcode.c), bezskutecznie.

questionAnswers(0)

yourAnswerToTheQuestion