如何在R包命名空间文件中正确使用useDynLib()

时间:2012-10-19 14:08:07

标签: r namespaces makefile package shared-libraries

虽然互联网上存在一些解决方案,但我发现这些解决方案都不适合我面临的问题(尽管我可能只是太愚蠢了):

我正在尝试构建一个R包,它广泛使用由Makefile编译的共享对象(是的,糟糕的做法,我知道,但是不能告诉Makevars文件将C和Fortran代码编译成一个共享对象)来自包的src目录中的代码。无论我在哪里编译.so(我尝试了srclibs和包基础文件夹)或我如何命名(作为上面提到的解决方案之一,它必须命名为包它包含在)中,R CMD check

退出
** testing if installed package can be loaded
Error in library.dynam(lib, package, package.lib) : 
shared object ‘SoMNibEN.R.so’ not found

由于我的NAMESPACE文件中的useDynLib(SoMNibEN.R)指令(其中SoMNibEN.R是我的包的名称,但它也不能与原始名称一起使用)

我的假设是我要么使用useDynLib()命令错误,要么我的Makefile出错了(虽然编译工作得很好,共享对象是在我的项目文件夹中创建的 - 我只是不知道是否成功复制到包安装目录。

所以,如果有人知道我在这里做错了什么,请告诉我!

1 个答案:

答案 0 :(得分:8)

您希望包的名称作为参数,因为这是R构建的共享对象的名称,例如useDynLib("chron")。引号是可选的(因为它们适用于library()等)。

我还建议使用Makefile,只需删除src/目录中的C和Fortran文件。 R通常很聪明,知道该怎么做。如果您需要-I等开关,可以在那里进行设置。

最后,使用CRAN。有数百个包含已编译源的包,其中一些包的结构与您的问题类似。