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
相关产品推荐
相关产品推荐

