R CMD 检查说明:发现没有调用:'R_registerRoutines'、'R_useDynamicSymbols'
R CMD check note: Found no calls to: ‘R_registerRoutines’, ‘R_useDynamicSymbols’
如何避免新的 R 开发版本 R CMD check
中出现以下注意事项( 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.
例如 Hmisc
该消息有些神秘。我也查看了其他包,发现 NAMESPACE 文件中的 useDynLib(packagename)
被 useDynLib(packagename, .registration = TRUE)
替换了。
另外,我在src/
目录下添加了一个.c
文件,命名为registerDynamicSymbol
,代码如下:
// 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);
}
我从 GitHub Rcpp. The canonical reference is in Writing R Extensions
中采纳了这个建议
还R Devel Mailinglist提供了补充信息。
更新
最直接直接的做法是:
- 使用当前的 R 开发版本(最终将成为 3.4)
- 运行
tools::package_native_routine_registration_skeleton(".")
并将完整输出复制并粘贴到 packagename_init.c
文件中以放入 src/
- 更新
NAMESPACE
,验证 useDynLib(packagename, .registration = TRUE)
- 如有必要,将
exportPattern
替换为 export( list of object to be exported )
7 月 18 日更新
正如@Symbolix 使用最新版本的 R 和 RStudio 的开发工具指出的那样,第 2 点(init.c 文件)似乎由开发工具(使用 RStudio 校验位)或工具包处理。
我 运行 遇到了 Windows 构建包的持续性问题。 (.dll 而不是 .so)
上面接受的答案也应该解决 Windows 的这个问题,但如果它没有解决它。确保 objdump.exe
指向适当的拱门。即 .../Mingw_64/bin/objdump.exe
。这可以在命令提示符下使用 which objdump.exe
检查。不知何故,32 位 objdump.exe
在我的路径中找到了更高优先级的位置。这种拱门不匹配会产生 File format not recognized
错误。
首先我完全按照 Giorgio Spedicato 所说的去做。但仍然收到注意警告。最后我通过这样做解决了问题:
Sys.setenv(路径=粘贴(Sys.getenv("路径"),
"C:\RTools40",
"C:\RTools40\mingw64\bin",
sep = ";"))
必须将 mingw64\bin 添加到 PATH,因为那是 objdump.exe 所在的位置
如何避免新的 R 开发版本 R CMD check
中出现以下注意事项( 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.
例如 Hmisc
该消息有些神秘。我也查看了其他包,发现 NAMESPACE 文件中的 useDynLib(packagename)
被 useDynLib(packagename, .registration = TRUE)
替换了。
另外,我在src/
目录下添加了一个.c
文件,命名为registerDynamicSymbol
,代码如下:
// 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);
}
我从 GitHub Rcpp. The canonical reference is in Writing R Extensions
中采纳了这个建议还R Devel Mailinglist提供了补充信息。
更新
最直接直接的做法是:
- 使用当前的 R 开发版本(最终将成为 3.4)
- 运行
tools::package_native_routine_registration_skeleton(".")
并将完整输出复制并粘贴到packagename_init.c
文件中以放入src/
- 更新
NAMESPACE
,验证useDynLib(packagename, .registration = TRUE)
- 如有必要,将
exportPattern
替换为export( list of object to be exported )
7 月 18 日更新
正如@Symbolix 使用最新版本的 R 和 RStudio 的开发工具指出的那样,第 2 点(init.c 文件)似乎由开发工具(使用 RStudio 校验位)或工具包处理。
我 运行 遇到了 Windows 构建包的持续性问题。 (.dll 而不是 .so)
上面接受的答案也应该解决 Windows 的这个问题,但如果它没有解决它。确保 objdump.exe
指向适当的拱门。即 .../Mingw_64/bin/objdump.exe
。这可以在命令提示符下使用 which objdump.exe
检查。不知何故,32 位 objdump.exe
在我的路径中找到了更高优先级的位置。这种拱门不匹配会产生 File format not recognized
错误。
首先我完全按照 Giorgio Spedicato 所说的去做。但仍然收到注意警告。最后我通过这样做解决了问题:
Sys.setenv(路径=粘贴(Sys.getenv("路径"), "C:\RTools40", "C:\RTools40\mingw64\bin", sep = ";"))
必须将 mingw64\bin 添加到 PATH,因为那是 objdump.exe 所在的位置