带有 Rcpp 的 R Cran 包构建在除 Solaris 之外的每个系统上

R Cran package with Rcpp builds on every system but Solaris

我正在研究一个提交给 CRAN 的 R 库,它可以在除 Solaris 以外的所有平台上编译。 感谢 The R-hub builder 网站,我能够在该系统上遇到两种不同类型的错误(否则我无法访问任何 Solaris 计算机)。

但是,我不知道我得到的错误。此外,两个编译器的行为完全不同:

  1. 使用选项:“Oracle Solaris 10,x86,32 位,R-release”,我的代码可以编译,但在运行时崩溃并出现“段错误”。

  2. 使用选项:“Oracle Solaris 10,x86,32 位,R-release,Oracle Developer Studio 12.6”,代码甚至无法编译,得到一个奇怪的错误:

"rcpp_module.cpp", line 340: Error: The name function is ambiguous, void Rcpp::function<RESULT_TYPE>(const char*, RESULT_TYPE()(), const char) and std::function<_Signature>.

由于包编译(零警告)并在 Windows、Ubuntu、CentOs、Mac OS X 上执行,但我不知道是什么我应该寻找尽可能多的错误吗?

有没有其他人遇到同样的问题?你有什么提示吗?

感谢您的支持。

更新于 2021 年 4 月 30 日:我已经制定了一个最小的示例来重现系统 Oracle Solaris 10、x86 的 R-hub 构建器上的错误, 32 位,R 版本,Oracle Developer Studio 12.6。结果可用 here.

在 rcpp_module.cpp 文件中我们有:

#include <Rcpp.h>

#include "KWD_Histogram2D.h"

Rcpp::List compareAll(Rcpp::NumericMatrix Coordinates,  // This is line 49
    Rcpp::NumericMatrix Weights, int L = 3,
    bool recode = true, const std::string& method = "approx",
    const std::string& algorithm = "colgen",
    const std::string& model = "mincostflow",
    const std::string& verbosity = "silent",
    double timelimit = 14400, double opt_tolerance = 1e-06,
    bool unbalanced = false, double unbal_cost = 1e+09,
    bool convex = true) {

    Rcpp::List sol;

    return sol;
}

RCPP_MODULE(SKWD) {
    using namespace Rcpp;

    function("compareAll", &compareAll,
        List::create(_["Coordinates"], _["Weights"], _["L"] = 3,
            _["recode"] = true, _["method"] = "approx",
            _["algorithm"] = "colgen", _["model"] = "mincostflow",
            _["verbosity"] = "silent", _["timelimit"] = 14400,
            _["opt_tolerance"] = 1e-06, _["unbalanced"] = false,
            _["unbal_cost"] = 1e+09, _["convex"] = true),
        "compare all histograms using the given search options");
}

包含的文件KWD_Histogram2D.h基本上是空的。 R-hub输出的错误如下:

"rcpp_module.cpp", line 49: Error: The name function is ambiguous, void Rcpp::function<RESULT_TYPE>(const char*, RESULT_TYPE(*)(), const char*) and std::function<_Signature>.
1 Error(s) detected.

更新于 02.05.2021:重新运行 命令 Rcpp::compileAttributes() 重写文件 RcppExports.cppRcppExports.R。然而,即使是带有 Student class 的基本 Rcpp 教程示例也无法在带有 Oracle Developer Studio 12.6 的 Solaris 上运行。现在错误类似于以下错误:

Error: package or namespace load failed for ‘RcppStudent’ in .doLoadActions(where, attach): error in load action .__A__.1 for package RcppStudent: loadModule(module = "RcppStudentEx", what = TRUE, env = ns, loadNow = TRUE): Unable to load module "RcppStudentEx": negative length vectors are not allowed Error: loading failed Execution halted

我刚刚在 rcpp-modules-student 上报告了这个问题。

更新于 03.05.2021:我的 C++ 代码使用通过 OpenCSW 安装的 gcc-5.5 在 Solaris 11 下(通过 VirtuloBox)编译并正确运行。因此,该错误位于我编写的 Rcpp 包装器和 Solaris 下的 R 系统 运行 之间。

更新于 07.05.2021:我已经在下面回答了我自己的问题。

在第 335-340 行 Github 的代码中

  .method("num_arcs", &KWD::Solver::num_arcs,
          "get the number of arcs in the Network model")

  .method("num_nodes", &KWD::Solver::num_nodes,
          "get the number of arcs in the Network model")

应该不是第二个节点吧?

 .method("num_nodes", &KWD::Solver::num_nodes,
         "get the number of nodes in the Network model")

重现 CRAN 自动构建系统上发生的问题的唯一方法是使用 https://files.r-hub.io/solaris/ and updating the version of R following the instructions described in the solarischeck GitHub 存储库中可用的映像在 VirtualBox 中本地安装 Solaris 10。

最后,错误出在我的代码中,因为浮点数之间的危险逻辑表达式导致无限递归调用,因此出现溢出C 堆栈的。

Solaris 纯属偶然提出了这个问题。