在Windows下为R包编译Fortran代码:对REXIT、RWARN、RCHKUSR的未定义引用

在Windows下为R包编译Fortran代码:对REXIT、RWARN、RCHKUSR的未定义引用,r,compilation,makefile,shared-libraries,gfortran,R,Compilation,Makefile,Shared Libraries,Gfortran,我正在开发一个包含Fortran源文件的R包。Fortran代码的结构相当复杂,有许多依赖项,因此我在src文件夹中有一个Makefile用于编译共享库 到目前为止,我一直在运行Ubuntu 14.04的机器上编译这个包,没有任何问题。我现在正试图使用Rtools在Windows上编译它,但在链接对象以生成共享库时遇到了问题。更准确地说,链接器找不到函数REXIT、RWARN和RCHKUSR,因为我得到了以下错误消息: undefined reference to `rchkusr_' unde

我正在开发一个包含Fortran源文件的R包。Fortran代码的结构相当复杂,有许多依赖项,因此我在src文件夹中有一个Makefile用于编译共享库

到目前为止,我一直在运行Ubuntu 14.04的机器上编译这个包,没有任何问题。我现在正试图使用Rtools在Windows上编译它,但在链接对象以生成共享库时遇到了问题。更准确地说,链接器找不到函数REXIT、RWARN和RCHKUSR,因为我得到了以下错误消息:

undefined reference to `rchkusr_'
undefined reference to `rexit_'
undefined reference to `rwarn_'
这些函数应该位于共享库R.dll(Linux下的libR.so)中。我用Dependencies Walker检查了这个库,我可以找到这些函数。我已尝试链接到
-ic:/Program\Files/R/R-3.1.1/bin/i386/R.dll
,以明确引用共享库。我尝试重新编译
-fno下划线
,以确保下划线不是问题所在。没有任何帮助

你知道这个问题是从哪里来的吗?欢迎提出任何建议

在Linux下,我不需要做任何特殊的事情,链接器在Makefile中没有指定任何内容就找到了函数

我使用的是R版本3.1.1和Rtools版本3.1


非常感谢您的帮助。

在摆弄了Makefile之后,我终于找到了问题的解决方案:我试图传递给链接器的标志是错误的。只应使用
-L
指定共享库R.dll的路径,并且应使用命令末尾的标志
-lR
指定库的名称。简言之,我指定

gfortran -shared *.o -o myLib.dll -L C:/Program\ Files/R/R-3.1.1/bin/i386 -lR
创建myLib.dll,它成功了!我想我有点困惑,因为在Linux下,不需要指定任何东西,链接器自己找到共享库

可能不是我能得到的最好、最可移植的解决方案(我现在有两个Makefile要处理,
Makefile
用于Linux和
Makefile.win
用于Windows…),但现在已经足够好了