Cコード付きのRパッケージ、パッケージdllに「そのような記号はありません」

Aug 20 2020

私はRパッケージを書いていて、それにCコードを含め始めました。ここからの指示に従って、「。C()の使用を開始する」の下で、src /にac関数と、roxygenタグを介してリンクするrラッパーを作成しました@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を更新すると、一部の問題が修正されたと読みました。私は昨日両方を更新しましたが、役に立ちませんでした。

どんな助けでも大歓迎です。

(これは、現在回答されていないこの質問の問題に似ています。)

(この質問では、RCMDの代わりにdevtools :: document()を使用することを除いて、この質問にも関連している可能性があります。)


関連コード:

# 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) {...}

回答

bert Aug 20 2020 at 16:41

問題はこの行にあることが判明しました

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

この投稿で述べたように、

staticキーワードはやや使いすぎです。関数に適用される場合、それは関数が内部リンケージを持っていることを意味します。つまり、そのスコープは変換ユニット内に制限されます(単にソースファイルとして)。

つまり、「static」キーワードを使用すると、関数をそれ自体のユニットの外部から呼び出すことができなくなり、「そのようなシンボルはありません」というエラーが発生します。

'static'キーワードを削除すると、問題が解決します。