【问题标题】:How to use useDynLib() correctly in an R package namespace file如何在 R 包命名空间文件中正确使用 useDynLib()
【发布时间】:2012-10-10 04:09:51
【问题描述】:

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

我正在尝试构建一个 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 做错了(尽管编译工作得很好,并且共享对象是在我的项目文件夹中创建的 - 我只是不这样做'不知道是否成功复制到包安装目录)。

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

【问题讨论】:

    标签: r namespaces makefile package shared-libraries


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上,“通常足够聪明”有点误导。在删除 Makefile 并重命名我的一个文件以便更早地编译它之后(由于我的 src/ 目录中文件的字母顺序),我的包编译成功了。不过,我不会调用“按字母顺序编译src/ 中的所有文件”smart。无论如何,感谢您再次提供帮助。
    • 从什么时候开始编译顺序很重要?链接器有时会这样做,但不是 cipiler。无论如何...
    • 显然它在我的程序中......它由两个 F90 文件组成,一个最初是配置脚本,另一个是实际计算 - 不过它使用了配置脚本中的少数变量。这会导致编译器抱怨配置脚本中缺少 .mod 文件,以防之前没有编译过。老实说,我对 Fortran 的了解还不够,无法以两种文件都可以按任何顺序编译的方式来编写这些东西。
    • Ack - 在我更熟悉的 C / C++ 语言中没有对应关系。在这种情况下,您希望在 Makevars 文件中声明这些依赖项,但不要提供已由 R 填充的所有目标。这没有很好的文档记录。如果有疑问,请在 r-devel 上询问。
    猜你喜欢
    • 2012-06-04
    • 2010-09-07
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    相关资源
    最近更新 更多