El símbolo de Fortran no está en la tabla de carga (no se puede llamar al símbolo cargado en R)

Estoy tratando de construir una DLL Fortran con Absoft Pro Fortran 13.0.3, 64 bits, para uso dentro de R, en Windows 7 64 bits.

Aquí está mi archivo mycalc.f (es un ejemplo tonto, solo para probar la funcionalidad):

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

La declaracióndll_export no es estándar, pero se encuentra en algunos compiladores Fortran (AFAIK también se encuentra en Lahey y CVF e Intel Fortran tiene una directiva de compilador en su lugar). Simplemente le dice al compilador qué símbolos deben exportarse.

Compilo exitosamente con:af90 -m64 -dll -YDLL_NAMES=LCS mycalc.f -o mycalc.dll

La opción-YDLL_NAMES=LCS le dice al compilador que construya una biblioteca con símbolos en minúscula, lo que parece mejor para R.

Si corrodumpbin /exports mycalc.dll, Puedo encontrar mycalcf en símbolos exportados, en minúsculas, sin ningún guión bajo antes o después.

Ahora, desde R (versión de 64 bits), los siguientes trabajos:

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

Obtengo c = 29 a la vuelta, como se esperaba.

PERO, si reinicio R, lo siguiente no funciona (aviso que solo quité elis.loaded prueba):

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

Me sale el error:Fortran symbol name "mycalcf" not in load table.

Ahora mi pregunta es: ¿por qué es tan importante esta prueba?

A modo de comparación, cuando intento lo mismo con gfortran en lugar de Absoft, no tengo ningún problema. Yo compilo con:gfortran -m64 -shared -o mycalc2.dll mycalc.f (después de comentar la declaración dll_export, que no es necesaria, ni siquiera reconocida, por gfortran). Entonces en R:

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

Y obtengo c = 29, no hay error.

Ahora, sospecho que hay algo que hace el enlazador gcc que no lo hace automáticamente el enlazador de Absoft (en realidad es el link.exe de Microsoft). Pero no tengo ni idea de lo que puede ser.

Cualquier idea es bienvenida!

Ok, solución después de una buena pregunta de Vladimir F (ver comentarios). En realidad, uno debe agregar guiones bajos a los nombres de los símbolos. Ya que no hay manera de hacerlo por opción del compilador, uno necesitaCDEC$ directivas (verHP oIntel documentación).

Aquí es simplemente:

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

Segunda solución, desdeForo absoft: en realidad estaba equivocado desde el principio. Contrariamente a lo que pensé, uno no necesita usar la declaración dll_export, e incluso presentó el problema: sin ella, el compilador agrega guiones bajos. Todos los símbolos se exportan de forma predeterminada, como en gfortran. Así que el código correcto es simplemente:

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

Incluso no hay necesidad de ninguna opción para obtener símbolos en minúsculas, también son los valores predeterminados.

Sin embargo, queda una pregunta: cumple la función R.Fortran siempre agregue guión bajo (¿hay una manera de decirle que no lo haga?), y si siempre se agrega, ¿por qué la llamada funciona cuandois.loaded se llama de antemano? R parece estar haciendo algo raro aquí. Traté de rastrearis.loaded en el código fuente de R (hastado_isloaded ensrc\main\dotcode.c), en vano.

Respuestas a la pregunta(0)

Su respuesta a la pregunta