Impossibile compilare RcppArmadillo

Nov 03 2020

RcppArmadillo è una dipendenza di alcuni pacchetti che sto cercando di installare. Ottengo questo errore durante la compilazione di RcppArmadillo versione 0.10.1.0.0 (che è ciò che R estrae automaticamente da CRAN quando rileva che RcppArmadillo è 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

Questo viene costruito all'interno di un contenitore Singuarity in R 3.6.0 e con GCC 4.8.5 su CentOS 7. Posso installare la versione 0.9.900.3.0 di RcppArmadillo bene con il comando "install_version" da devtools ( e questa versione ha completamente funzionava bene prima con gli stessi altri pacchetti, motivo per cui è quello che sto cercando di installare), tuttavia, R lo aggiorna immediatamente alla versione 0.10.1.0.0 ogni volta che un altro pacchetto che sto installando richiede RcppArmadillo come dipendenza, il che causa l'errore precedente e la mia build non riesce. Non sono stato in grado di trovare un modo per impedire a R di farlo a meno di dirgli di non installare affatto le dipendenze per determinati pacchetti, ma questo pone mal di testa e volevo vedere se c'era una soluzione più semplice qui. Qualcuno sa come correggere questo errore di compilazione o come impedire a R di aggiornare automaticamente il pacchetto all'installazione di un altro pacchetto che ne ha bisogno?

Ecco la parte dell'output che mostra l'aggiornamento in corso subito dopo l'installazione della versione 0.9.900.3.0 di 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'

Risposte

4 DirkEddelbuettel Nov 03 2020 at 06:31

Questo è stato discusso alcune volte in precedenza nel repository GitHub, o nella mailing list o qui.

La tua scommessa più semplice è scegliere una versione aggiornata tramite

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

Poiché ciò non influisce su nessuno dei sistemi distribuiti da CRAN (o dalla maggior parte degli utenti), è probabile che non valga la pena un nuovo caricamento (e tutti i problemi associati). Potresti prendere in considerazione l'idea di passare da CentOS 7 se hai una scelta in materia.