我正在Linux机器上工作,我在〜/ .R / Makevars中创建的Makevars文件包含以下内容:
CXX = g++
CXXSTD = -std=gnu++17
我正在使用以下代码运行R 3.5.1-intel-mkl:
library(Rcpp)
library(RcppArmadillo)
sourceCpp("code.cpp",cacheDir="~/goldfish/solvers/junkdir",rebuild=T,showOutput=T,verbose=T)
我怀疑cpp文件的内容是否重要,因为该错误涉及环境问题:
code.cpp: In function ‘void polyRegression(const std::vector<int, std::allocator<int> >&, const std::vector<int, std::allocator<int> >&)’:
code.cpp:188:18: error: ‘transform_reduce’ is not a member of ‘std’
我尝试了这一行代码(感谢this answer)
g++ -x c++ -E -dM -< /dev/null | grep __cplusplus
测试版本,这是输出:
#define __cplusplus 201402L
根据this answer,这可能意味着部分支持。我有点迷茫,所以我的问题是:
1)此版本的g ++不支持transform_reduce方法吗?如果没有,您可以推荐其他替代方法吗? 2)如果支持transform_reduce并且我的Makevars出现错误,或者操作系统由于某种原因无法将其拾取,那么如何强制操作系统找到它?
编辑:
根据Dirk Eddelbuettel的建议(再次感谢),我需要在Makevars中设置所有正确的变量和标志。我也读过this answer,这很有启发性,但是我不确定将C ++设置为编译为transform_reduce可以使用的版本的方法。这是我目前的标志(我认为CXXSTD
和CXX17STD
将解决问题,但还没有解决。)
CXX = g++
CXXSTD = -std=gnu++17
CXXCPP = $(CXX) -E
CXXFLAGS = -g -O2 $(LTO)
CXXPICFLAGS = -fpic
CXX98 = g++
CXX98FLAGS = -g -O2
CXX98PICFLAGS = -fpic
CXX98STD = -std=gnu++98
CXX11 = g++
CXX11FLAGS = -g -O2
CXX11PICFLAGS = -fpic
CXX11STD = -std=gnu++11
CXX14 = g++
CXX14FLAGS = -g -O2
CXX14PICFLAGS = -fpic
CXX14STD = -std=gnu++14
CXX17 = g++
CXX17FLAGS = -g -O2
CXX17PICFLAGS = -fpic
CXX17STD = -std=gnu++17