R CMD检查注释:未发现任何调用:'R_registerRoutines','R_useDynamicSymbols'

Cro*_*ops 44 r compilation devtools

如何避免以下R CMD check使用新R开发版本出现的注意事项(R Under development(unstable)(2017-02-15 r72179))?

• checking for unstated dependencies in examples ... OK
• checking line endings in C/C++/Fortran sources/headers ... OK
• checking compiled code ... NOTE
File ‘pkgname/libs/pkgname.so’:
  Found no calls to: ‘R_registerRoutines’, ‘R_useDynamicSymbols’

It is good practice to register native routines and to disable symbol
search.
Run Code Online (Sandbox Code Playgroud)

例如在Hmisc中

Gio*_*ato 37

这个消息有些神秘.我在其他包中也环顾四周,发现useDynLib(packagename)NAMESPACE文件中的内容被替换为useDynLib(packagename, .registration = TRUE).

另外,我添加了一个.c文件,registerDynamicSymbolsrc/目录中用以下代码命名:

// RegisteringDynamic Symbols

#include <R.h>
#include <Rinternals.h>
#include <R_ext/Rdynload.h>

void R_init_markovchain(DllInfo* info) {
  R_registerRoutines(info, NULL, NULL, NULL, NULL);
  R_useDynamicSymbols(info, TRUE);
}
Run Code Online (Sandbox Code Playgroud)

我从GitHub Rcpp那里得到了这个建议.规范性引用在Writing R Extensions中

此外,R Devel Mailinglist还提供了补充信息.

UPDATE

最直接的直接方法是:

  1. 使用当前的R开发版(最终将成为3.4)
  2. 运行tools::package_native_routine_registration_skeleton(".")并复制并将完整输出粘贴packagename_init.c到要放入的文件中src/
  3. 更新NAMESPACE,验证useDynLib(packagename, .registration = TRUE)
  4. 如有必要,则更换exportPatternexport( list of object to be exported )

7月18日更新

正如@Symbolix使用最新版本的R和RStudio的devtools所指出的那样,第2点(init.c文件)似乎由devtools(使用RStudio校验位)或工具包处理.

  • 对于使用roxygen的人,将`@useDynLib packagename`更改为`@useDynLib packagename,.registration = TRUE`,这样您就不需要手动编辑NAMESPACE文件了. (7认同)
  • 这非常有帮助.我遇到的唯一问题是devtools :: release()想要在发布前检查期间重新编写NAMESPACE文件,因此丢失了useDynLib编辑.调用释放函数时设置check = FALSE. (3认同)
  • 在R 3.4.0(并且还使用从roxygen生成的NAMESPACE)构建时,我只需要步骤1和2 (2认同)
  • 为了进一步参考,我得到了错误消息:未能为***分配RegisteredNativeSymbol,因为*已经在*命名空间中定义.只是意味着我有c例程和R包装器具有相同的名称,所以不得不将C例程重命名为不同的名称,重新运行进程,并且很好. (2认同)

小智 5

我遇到了Windows构建包的持久性问题.(.dll而不是.so)

上面接受的答案也应解决Windows的这个问题,但如果它没有解决它.确保objdump.exe指向适当的拱门.即.../Mingw_64/bin/objdump.exe.可以使用命令提示符检查which objdump.exe.不知何故,32位objdump.exe在我的路径中找到了更高优先级的位置.此拱不匹配将产生File format not recognized错误.