错误:无法在R中加载gfortran编译的DLL(“加载表中没有符号名”)
嗯,我最近爱上了错误:无法在R中加载gfortran编译的DLL(“加载表中没有符号名”),r,windows,dll,fortran,R,Windows,Dll,Fortran,嗯,我最近爱上了Fortran(f90),并且一直在努力理解R和Fortran的“功夫”。我在这里发现了几个相关且有用的问题(例如和) 我想做什么: 我(可能是在尝试做一些疯狂的事情)试图使用.Fortran()函数调用R(x64)中的以下.f90子例程。以下是测试.f90代码: ! Computes the square of a number Subroutine sr1(a,b) !DEC$ ATTRIBUTES DLLEXPORT::sr1 !DEC$ ATTRIBUTES C, RE
Fortran
(f90
),并且一直在努力理解R
和Fortran
的“功夫”。我在这里发现了几个相关且有用的问题(例如和)
我想做什么:
我(可能是在尝试做一些疯狂的事情)试图使用.Fortran()
函数调用R
(x64)中的以下.f90
子例程。以下是测试.f90
代码:
! Computes the square of a number
Subroutine sr1(a,b)
!DEC$ ATTRIBUTES DLLEXPORT::sr1
!DEC$ ATTRIBUTES C, REFERENCE, ALIAS:'sr1' :: sr1
implicit none
integer a,b
b = a*a
End Subroutine sr1
! Computes the cube of a number
Subroutine sr2(x,y)
!DEC$ ATTRIBUTES DLLEXPORT::sr2
!DEC$ ATTRIBUTES C, REFERENCE, ALIAS:'sr2' :: sr2
implicit none
integer x,y
y = x*x*x
End Subroutine sr2
我正在Windows 10计算机上通过gfortran
编译上述test.f90
代码,方法是:
gfortran -shared -o test.dll test.f90
编译工作正常,我得到了test.dll
。现在,在R
中。我尝试加载它:
dyn.load("path_to_file/test.dll")
它起作用了。但是,它在这里失败了:
> is.loaded("test")
[1] False
我已经找到了一个相关的问题。但是,我找不到解决问题的线索。有人能提出一些解决问题的方法吗?我不是R的大用户,但我的测试表明
is.loaded("test_R")
确实返回FALSE
,两者都是
is.loaded("sr1")
及
返回
TRUE
。但我在Linux和GCC上进行了测试,这可能会对外部可见的子例程名称进行不同的解释。请对所有Fortran问题使用tag。您可以为特定于版本的问题添加特定版本的标记,但您的问题不是特定于版本的。请注意,Fortran 90非常陈旧和过时。另外请注意,没有必要在每个函数中都使用返回
。谢谢您的建议。我刚刚编辑了代码。除了修复问题的建议之外,我还想知道这个错误在某种程度上是否可以重现。要明确的是,返回值并不能修复任何问题,它们只是样式问题。也就是说,is.loaded()
询问共享对象中的符号,而不是库的名称。谢谢你们。is.loaded(“sr1”)也返回TRUE并解决了问题。
is.loaded("sr2")