You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R包开发中启用ARMA_64BIT_WORD后编译报错求助

解决RcppArmadillo处理大矩阵时的ARMA_64BIT_WORD编译错误

问题场景

开发R包时,处理超大矩阵触发报错:

Error: Mat::init(): requested size is too large; suggest to enable ARMA_64BIT_WORD

尝试开启ARMA_64BIT_WORD后,编译C++代码时出现新错误。

修改后的代码与配置

C++代码片段

#define R_NO_REMAP
#include <map>
#include <vector>
#include <iostream>
#include <stream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>

#include "ANN/ANN.h"        // ANN library header
#include "NN.h"             // ANN library header
#include <R.h>              // R header

#define ARMA_64BIT_WORD 1
#include <RcppArmadillo.h>

#define Malloc(type,n) (type *)malloc((n)*sizeof(type))

#ifdef _OPENMP
#include <omp.h>
#endif
#include <cstdlib>

using namespace std;
using namespace Rcpp;


// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]] 

// [[Rcpp::export]]

/src/Makevars(含Windows平台Makevars.win)配置

PKG_CPPFLAGS=-I. -IANN -DRANN -DARMA_64BIT_WORD=1
PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) 

修复步骤

  • 确保宏定义优先级:#define ARMA_64BIT_WORD 1必须在所有Armadillo相关头文件引入前定义。检查NN.h或ANN.h是否间接包含Armadillo头文件,若有,需将该宏定义移至所有头文件包含语句的最开头。
  • 避免重复定义:不要同时在代码和Makevars中定义ARMA_64BIT_WORD,二选一即可。建议保留Makevars中的定义,删除代码里的#define ARMA_64BIT_WORD 1,防止编译冲突。
  • 确认C++版本兼容:确保使用C++11及以上标准(代码中已通过cpp11插件指定,无需额外调整)。
  • 检查依赖库位数:链接的LAPACK/BLAS库需为64位版本,避免因位数不匹配引发编译或运行错误。

内容的提问来源于stack exchange,提问作者Stefano Cacciatore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:05:04