无法编译 RcppArmadillo

Posted

技术标签:

【中文标题】无法编译 RcppArmadillo【英文标题】:Cannot compile RcppArmadillo 【发布时间】:2020-11-02 20:21:54 【问题描述】:

RcppArmadillo 是我尝试安装的几个软件包的依赖项。我在编译 RcppArmadillo 版本 0.10.1.0.0 时收到此错误(这是 R 在发现 RcppArmadillo 是一个 dep 时自动从 CRAN 中提取的内容):

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

这是在 R 3.6.0 中的 Singuarity 容器内构建的,在 CentOS 7 上使用 GCC 4.8.5。我可以使用 devtools 中的“install_version”命令安装 RcppArmadillo 的 0.9.900.3.0 版本(并且此版本在使用相同的其他软件包之前完全可以正常工作,这就是为什么我要安装它的原因),但是,每当我使用另一个软件包时,R 都会立即将其更新到版本 0.10.1.0.0我正在安装需要 RcppArmadillo 作为依赖项,这会导致上面的错误和我的构建失败。除了告诉它根本不为某些包安装依赖项之外,我还没有找到一种方法来阻止 R 这样做,但这让人头疼,我想看看这里是否有更简单的解决方案。有谁知道如何修复这个编译错误或如何防止 R 在安装另一个需要它的包时自动更新包?

这是显示在成功安装 RcppArmadillo 版本 0.9.900.3.0 后发生的更新的输出部分:

* 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'

【问题讨论】:

【参考方案1】:

之前在 GitHub 存储库、邮件列表或此处已讨论过几次。

您最简单的选择是通过

选择更新版本
install.packages("RcppArmadillo", repos="https://rcppcore.github.io/drat")

由于这不会影响 CRAN(或大多数用户)部署的任何系统,因此可能不值得重新上传(以及所有相关的麻烦)。如果您在这方面有选择权,您可能会考虑从 CentOS 7 继续。

【讨论】:

对不起 - 我不太明白。您所说的“由于这不会影响 CRAN(或大多数用户)部署的任何系统,因此可能不值得重新上传(以及所有相关的麻烦)。”是什么意思?新上传的内容是什么?这个编译问题不会影响大多数 CRAN 用户吗? 每个 CRAN 包都有一个结果页面列出测试状态,RcppArmadillo it is here。它表明当前的 CRAN 版本“无处不在”。但是总有一些罕见的异常值,带有古老编译器的amd CentOS 7就是其中之一。我们有修复,它在我指给你的微版本中,它将在 next CRAN 版本中。我们现在根本不急于推出。 啊好吧,我明白了。有道理,谢谢你的信息! 为了后代,相关的错误报告是here

以上是关于无法编译 RcppArmadillo的主要内容,如果未能解决你的问题,请参考以下文章

eclipse无法编译

golang编译androidso无法加载

无法编译openssl,因为'cl'无法识别

QT 在Ubuntu下无法编译,怎么解决

pycharm无法编译

sublime无法编译中文