带有C代码的R包,包dll中的'no such symbol'

R package with C code, 'no such symbol' in package dll

我正在编写一个 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) {...}

原来是这一行的问题

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

所述

The static keyword is somewhat over used. When it applies to function, it means that the function has internal linkage, ie its scope is limited to within a translation unit (simply as a source file).

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

删除 'static' 关键字即可解决问题。