带C代码的R包调用报错:DLL requires the use of native symbols
解决R包中启用
R_forceSymbols()后的调用错误问题 错误原因
当你在C代码中设置R_forceSymbols(dll, TRUE)时,R会强制要求所有对DLL符号的调用必须使用已注册的原生符号引用,禁止通过字符串名称(如.Call("c_hello"))进行动态符号查找。你的当前调用方式违反了这一规则,因此触发DLL requires the use of native symbols错误。
解决方案(保留R_forceSymbols()的前提下)
方法一:手动获取原生符号地址
修改R/hello.R中的hello函数,通过getNativeSymbolInfo获取已注册符号的地址,再传入.Call:
#' @export hello <- function() { # 获取已注册的c_hello符号地址 sym_addr <- getNativeSymbolInfo("c_hello", PACKAGE = "dllreprex")$address .Call(sym_addr) }
方法二:利用roxygen2自动生成符号绑定
修改R/hello.R中的roxygen2标签,添加.fixes参数让工具自动绑定原生符号,从而直接调用符号对象而非字符串:
#' @useDynLib dllreprex, .registration = TRUE, .fixes = "c_" #' @export hello <- function() { .Call(c_hello) }
.fixes = "c_"会告诉roxygen2自动将C端前缀为c_的注册符号,绑定到R环境中去掉前缀的对象(这里就是c_hello对应R中的c_hello)。- 重新运行
devtools::document()后,NAMESPACE会自动更新对应的注册配置,确保符号被正确引用。
验证
两种方法都能在保留R_forceSymbols(dll, TRUE)的情况下,正常执行dllreprex::hello()并返回"hello",同时维持禁止动态符号查找的安全机制。
内容的提问来源于stack exchange,提问作者landau
相关产品推荐
相关产品推荐

