Impossible de compiler RcppArmadillo

Nov 03 2020

RcppArmadillo est une dépendance de quelques packages que j'essaie d'installer. J'obtiens cette erreur lors de la compilation de RcppArmadillo version 0.10.1.0.0 (qui est ce que R tire automatiquement de CRAN quand il trouve que RcppArmadillo est un dep):

RcppArmadillo.cpp:26:40: error: redeclaration 'arma::arma_version::major' differs in 'constexpr'
 const unsigned int arma::arma_version::major;
                                        ^
In file included from ../inst/include/armadillo:91:0,
                 from ../inst/include/RcppArmadilloForward.h:49,
                 from ../inst/include/RcppArmadillo.h:31,
                 from RcppArmadillo.cpp:22:
../inst/include/armadillo_bits/arma_version.hpp:31:33: error: from previous declaration 'arma::arma_version::major'
   static constexpr unsigned int major = ARMA_VERSION_MAJOR;
                                 ^
RcppArmadillo.cpp:26:40: error: declaration of 'constexpr const unsigned int arma::arma_version::major' outside of class is not definition [-fpermissive]
 const unsigned int arma::arma_version::major;
                                        ^
RcppArmadillo.cpp:27:40: error: redeclaration 'arma::arma_version::minor' differs in 'constexpr'
 const unsigned int arma::arma_version::minor;
                                        ^
In file included from ../inst/include/armadillo:91:0,
                 from ../inst/include/RcppArmadilloForward.h:49,
                 from ../inst/include/RcppArmadillo.h:31,
                 from RcppArmadillo.cpp:22:
../inst/include/armadillo_bits/arma_version.hpp:32:33: error: from previous declaration 'arma::arma_version::minor'
   static constexpr unsigned int minor = ARMA_VERSION_MINOR;
                                 ^
RcppArmadillo.cpp:27:40: error: declaration of 'constexpr const unsigned int arma::arma_version::minor' outside of class is not definition [-fpermissive]
 const unsigned int arma::arma_version::minor;
                                        ^
RcppArmadillo.cpp:28:40: error: redeclaration 'arma::arma_version::patch' differs in 'constexpr'
 const unsigned int arma::arma_version::patch;
                                        ^
In file included from ../inst/include/armadillo:91:0,
                 from ../inst/include/RcppArmadilloForward.h:49,
                 from ../inst/include/RcppArmadillo.h:31,
                 from RcppArmadillo.cpp:22:
../inst/include/armadillo_bits/arma_version.hpp:33:33: error: from previous declaration 'arma::arma_version::patch'
   static constexpr unsigned int patch = ARMA_VERSION_PATCH;
                                 ^
RcppArmadillo.cpp:28:40: error: declaration of 'constexpr const unsigned int arma::arma_version::patch' outside of class is not definition [-fpermissive]
 const unsigned int arma::arma_version::patch;
                                        ^
make: *** [RcppArmadillo.o] Error 1
make: *** Waiting for unfinished jobs....
ERROR: compilation failed for package 'RcppArmadillo'
* removing '/usr/local/lib64/R/library/RcppArmadillo'
* restoring previous '/usr/local/lib64/R/library/RcppArmadillo'
Error: Failed to install 'unknown package' from URL:
  (converted from warning) installation of package 'RcppArmadillo' had non-zero exit status
Execution halted
FATAL:   post proc: exit status 1
FATAL:   While performing build: while running engine: exit status 255

Ceci est construit à l'intérieur d'un conteneur Singuarity dans R 3.6.0 et avec GCC 4.8.5 sur CentOS 7. Je peux installer la version 0.9.900.3.0 de RcppArmadillo avec la commande "install_version" de devtools ( et cette version a complètement fonctionnait bien avant avec les mêmes autres packages, c'est pourquoi c'est celui que j'essaie d'installer), cependant, R le met immédiatement à jour vers la version 0.10.1.0.0 chaque fois qu'un autre paquet que j'installe a besoin de RcppArmadillo en tant que dépendance, ce qui provoque alors l'erreur ci-dessus et l'échec de ma construction. Je n'ai pas été en mesure de trouver un moyen d'empêcher R de faire cela sans lui dire simplement de ne pas installer de dépendances pour certains paquets, mais cela pose des maux de tête et je voulais voir s'il y avait une solution plus simple ici. Est-ce que quelqu'un sait comment corriger cette erreur de compilation ou comment empêcher R de mettre à jour automatiquement le package lors de l'installation d'un autre package qui en a besoin?

Voici la partie de la sortie montrant la mise à jour qui se produit juste après l'installation de la version 0.9.900.3.0 de RcppArmadillo:

* DONE (RcppArmadillo)
Downloading package from url: https://ftp.osuosl.org/pub/cran/src/contrib/gratia_0.4.1.tar.gz
RcppArmad... (0.9.900.3.0 -> 0.10.1.0.0) [CRAN]
mvnfast      (NA          -> 0.2.5.1   ) [CRAN]
patchwork    (NA          -> 1.0.1     ) [CRAN]
Installing 3 packages: RcppArmadillo, mvnfast, patchwork
trying URL 'https://ftp.osuosl.org/pub/cran/src/contrib/RcppArmadillo_0.10.1.0.0.tar.gz'

Réponses

4 DirkEddelbuettel Nov 03 2020 at 06:31

Cela a déjà été discuté à quelques reprises dans le référentiel GitHub, dans la liste de diffusion ou ici.

Votre pari le plus simple est de choisir une version mise à jour via

install.packages("RcppArmadillo", repos="https://rcppcore.github.io/drat")

Comme cela n'affecte aucun des systèmes que CRAN (ou la plupart des utilisateurs) déploient, cela ne vaut probablement pas un nouveau téléchargement (et tous les tracas associés). Vous voudrez peut-être envisager de passer de CentOS 7 si vous avez le choix à cet égard.