Package R avec code C, 'aucun symbole de ce type' dans le package dll

Aug 20 2020

J'écris un package R et j'ai commencé à y inclure du code C. En suivant les instructions d ' ici , sous "démarrer avec .C()", j'ai créé une fonction ac dans src/, et un wrapper r, lié via la balise roxygen @useDynLib(<package-name>, <name_of_c_function>).

Cependant, après avoir exécuté devtools::document(), j'obtiens l'erreur suivante :

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

J'ai lu que la mise à jour de R et Rtools avait résolu le problème pour certains. J'ai mis à jour les deux hier, mais en vain.

Toute aide sera très appréciée.

(Ceci est similaire au problème de cette question , qui est actuellement sans réponse.)

(Cela peut également être lié à this question , sauf que j'utilise devtools::document() au lieu de R CMD dans cette question.)


Code pertinent :

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

Réponses

bert Aug 20 2020 at 16:41

Il s'avère que le problème est dans cette ligne

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

Comme mentionné dans ce post ,

Le mot-clé statique est un peu trop utilisé. Lorsqu'il s'applique à la fonction, cela signifie que la fonction a un lien interne, c'est-à-dire que sa portée est limitée à l'intérieur d'une unité de traduction (simplement en tant que fichier source).

En d'autres termes, le mot-clé 'static' rend la fonction plus invocable depuis l'extérieur de sa propre unité, entraînant ainsi l'erreur "no such symbol".

La suppression du mot-clé 'static' résout le problème.