14

尽管互联网上有一些解决方案,但我发现没有一个适合我当前面临的问题(尽管也许我太笨了):

我正在尝试构建一个 R 包,它广泛使用由 Makefile 编译的共享对象(是的,不好的做法,我知道,但是不能告诉 Makevars 文件将 C 和 Fortran 代码编译成一个共享对象) 来自包src目录中的代码。无论我将 .so 编译到哪里(我尝试了src,libs和 package 基本文件夹)或者我如何命名它(正如上面提到的解决方案之一,它必须像它所包含的包一样命名),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

由于useDynLib(SoMNibEN.R)我的 NAMESPACE 文件中的说明(SoMNibEN.R我的包的名称在哪里,但它也不适用于原始名称)

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

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

4

1 回答 1

10

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

我还建议不要使用 Makefile,而只是将 C 和 Fortran 文件放到src/目录中。R 通常足够聪明,知道要做什么。如果你需要-I等开关,你可以在那里设置它们。

最后,使用 CRAN。有数百个带有编译源的软件包,其中一些肯定在结构上与您的问题相似。

于 2012-10-19T18:02:11.857 回答