【问题标题】:R package with C code, 'no such symbol' in package dll带有 C 代码的 R 包,包 dll 中的“没有这样的符号”
【发布时间】:2020-08-19 15:57:07
【问题描述】:

我正在编写一个 R 包,并开始在其中包含 C 代码。按照here 的说明,在“.C() 入门”下,我在 src/ 中创建了一个 c 函数,并为它创建了一个 r 包装器,通过 roxygen 标记 @useDynLib(<package-name>, <name_of_c_function>) 链接。

但是,在运行devtools::document() 之后,我收到以下错误:

Error in FUN(X[[i]], ...) :
  no such symbol <name_of_c_function> in package C:/path/to/package/src/<package-name>.dll

我读到更新 R 和 Rtools 已经解决了一些问题。我昨天更新了他们两个,但没有用。

任何帮助将不胜感激。

(这类似于this question 中的问题,目前没有答案。)

(它也可能与this question 相关,只是我在该问题中使用 devtools::document() 而不是 R CMD。)


相关代码:

# R file
#' @useDynLib <package-name> <name_of_c_function>
#' @export
name_of_func <- function(y) {
  stopifnot(is.numeric(y))
  .C(name_of_c_function, y,y,length(y),1) [[2]]
}
// C file
<#include stdlib.h>
static void name_of_c_function(double* y, double* x, 
const unsigned int length, const double a) {...}

【问题讨论】:

  • 这个C文件真的编译了吗?
  • @user253751 我不确定如何检查...我有一个与 .c 文件同名的 .o 文件 --- 这是否意味着它已编译?
  • 这是两个步骤之一。该包还需要生成一个带有包名的.so(在Linux 上)。您的链接错误阻止了这种情况。您很可能缺少指向您引用但显然不提供的外部资源的链接指令(可能是simplexproj_Condat?)。因此“没有符号”。
  • @DirkEddelbuettel 在 Windows 上是否有 .so 等效项?我不完全理解你所说的链接指令是什么意思,你能详细说明一下吗?
  • 您可能想看看您的 R 副本随附的 Writing R Extensions 手册。

标签: r c dll r-package


【解决方案1】:

原来问题出在这一行

static void name_of_c_function(...){...}

this post中所述,

static 关键字被过度使用了。应用于函数时,表示该函数具有内部链接,即其范围仅限于翻译单元内(仅作为源文件)。

换句话说,'static'关键字使函数不再可从其自身单元外部调用,从而导致“没有这样的符号”错误。

删除“静态”关键字即可解决问题。

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2021-12-11
    • 2014-10-12
    相关资源
    最近更新 更多