Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:无法在R中加载gfortran编译的DLL(“加载表中没有符号名”)_R_Windows_Dll_Fortran - Fatal编程技术网

错误:无法在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")