You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:47:35