自更新到 R 3.4.0 以来,C++11 的 Rcpp 插件无法正常工作
Rcpp plugin for C++11 not working since update to R 3.4.0
自从我将R更新到新版本3.4.0后,启用C++11的Rcpp插件似乎无法正常工作。 (请注意,这与此处报告的情况不同 http://r.789695.n4.nabble.com/R-3-4-has-broken-C-11-support-td4732692.html)
我有需要 C++11 标准的 C++ 文件,我使用命令 Rcpp::sourceCpp(foo.cpp)
通过 Rcpp 在 R 中编译这些文件。 R 默认标准是 C++98,但我可以通过在我的 C++ 文件中添加以下命令来更改它
// [[Rcpp::plugins("cpp11")]]
这不再适用于新版本的 R 3.4.0,我的编译器使用默认标准 (C++98) 而不是 C++11,尽管有插件。它曾经与以前版本的 R 一起工作。
我目前的解决方案是为我的 R 会话设置一个环境变量:
Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
这是我在 R 中使用的配置:
sessionInfo()<br>
R version 3.4.0 (2017-04-21)
Platform: x86_64-suse-linux-gnu (64-bit)
Running under: openSUSE Leap 42.2<br>
Matrix products: default
BLAS: /usr/lib64/R/lib/libRblas.so
LAPACK: /usr/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8<br>
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C<br>
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C<br>
attached base packages:
[1] stats graphics grDevices utils datasets methods base<br>
loaded via a namespace (and not attached):
[1] compiler_3.4.0 rsconnect_0.4.3 tools_3.4.0
</pre>
我使用 Rcpp 包版本 0.12.1.0。
我的编译器如下:
~$ g++ --version | head -n1
g++ (SUSE Linux) 4.8.5 </pre>
我错过了什么吗?有没有其他人遇到同样的问题?
这是昨天在 GitHub issue tracker in #683 and already closed in pull request #684 上报道的,现在已被合并。
所以只需升级到 master 分支,或者暂时手动设置 env.var。这是一个上游 R 更改打破了这一点,没有提供向后兼容性。
根据答案——只需插入
# R code
Sys.setenv("USE_CXX11" = "yes")
sourceCpp("code.cpp")
# C++ code
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
double myhypot(double x, double y) {
return std::hypot(x,y);
}
...而且它确实有效!
自从我将R更新到新版本3.4.0后,启用C++11的Rcpp插件似乎无法正常工作。 (请注意,这与此处报告的情况不同 http://r.789695.n4.nabble.com/R-3-4-has-broken-C-11-support-td4732692.html)
我有需要 C++11 标准的 C++ 文件,我使用命令 Rcpp::sourceCpp(foo.cpp)
通过 Rcpp 在 R 中编译这些文件。 R 默认标准是 C++98,但我可以通过在我的 C++ 文件中添加以下命令来更改它
// [[Rcpp::plugins("cpp11")]]
这不再适用于新版本的 R 3.4.0,我的编译器使用默认标准 (C++98) 而不是 C++11,尽管有插件。它曾经与以前版本的 R 一起工作。
我目前的解决方案是为我的 R 会话设置一个环境变量:
Sys.setenv("PKG_CXXFLAGS"="-std=c++11")
这是我在 R 中使用的配置:
sessionInfo()<br> R version 3.4.0 (2017-04-21) Platform: x86_64-suse-linux-gnu (64-bit) Running under: openSUSE Leap 42.2<br> Matrix products: default BLAS: /usr/lib64/R/lib/libRblas.so LAPACK: /usr/lib64/R/lib/libRlapack.so locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8<br> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C<br> [9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C<br> attached base packages: [1] stats graphics grDevices utils datasets methods base<br> loaded via a namespace (and not attached): [1] compiler_3.4.0 rsconnect_0.4.3 tools_3.4.0 </pre>
我使用 Rcpp 包版本 0.12.1.0。 我的编译器如下:
~$ g++ --version | head -n1 g++ (SUSE Linux) 4.8.5 </pre>
我错过了什么吗?有没有其他人遇到同样的问题?
这是昨天在 GitHub issue tracker in #683 and already closed in pull request #684 上报道的,现在已被合并。
所以只需升级到 master 分支,或者暂时手动设置 env.var。这是一个上游 R 更改打破了这一点,没有提供向后兼容性。
根据
# R code
Sys.setenv("USE_CXX11" = "yes")
sourceCpp("code.cpp")
# C++ code
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
double myhypot(double x, double y) {
return std::hypot(x,y);
}
...而且它确实有效!