Rcpp 和默认 C++ 编译器
Rcpp and default C++ compiler
我在使用 Rcpp 时遇到了一些奇怪的问题 - 它使用了不可预测的 C++ 编译器。这道题有点类似于this question.
我在 OSX,我有 2 个编译器 - 默认 clang
和 clang-omp
,支持 openmp。我还有以下 ~/.R/Makevars
文件(我将 clang-omp
设置为默认编译器):
CC=clang-omp
CXX=clang-omp++
CFLAGS += -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS += -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp
问题是,我正在开发的包使用 clang++
而不是 clang-omp++
进行编译。我还尝试(作为解决问题的实验)更改包 src/Makevars
并设置 CXX=clang-omp++
并且修改 $R_HOME/etc/Makeconf
CXX
条目到 CXX = clang-omp++
。运气不佳 - 它仍然使用 clang++
编译。不知道为什么会这样。
这里还有一个可重现的小例子(来自控制台 R 和 Rstudio)(不知道它是否与上述问题有关)。
假设 2 个非常相似的 cpp 函数:
1.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
}
从 R:
调用 sourceCpp
library(Rcpp)
sourceCpp("src/Rcpp_compiler.cpp", verbose = T)
/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB -o 'sourceCpp_1.so' 'Rcpp_compiler.cpp'
clang-omp++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Users/dmitryselivanov/Library/R/3.2/library/Rcpp/include" -I"/Users/dmitryselivanov/projects/experiments/src" -fPIC -Wall -mtune=core2 -g -O2 -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp -c Rcpp_compiler.cpp -o Rcpp_compiler.o
clang-omp++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o sourceCpp_1.so Rcpp_compiler.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
按预期工作 - 使用 clang-omp++ 和来自 ~/.R/Makevars
的所有标志
2.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
}
Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB -o 'sourceCpp_2.so' 'Rcpp_compiler.cpp'
clang++ -std=c++11 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Users/dmitryselivanov/Library/R/3.2/library/Rcpp/include" -I"/Users/dmitryselivanov/projects/experiments/src" -fPIC -Wall -mtune=core2 -g -O2 -c Rcpp_compiler.cpp -o Rcpp_compiler.o
clang++ -std=c++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o sourceCpp_2.so Rcpp_compiler.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
我只添加了 // [[Rcpp::plugins(cpp11)]]
并且它使用 clang++
而不是 clang-omp++
进行编译
这是我的 sessionInfo()
:
R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.10.5 (Yosemite)
locale:
1 en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
1 stats graphics grDevices utils datasets methods base
other attached packages:
1 Rcpp_0.12.1
loaded via a namespace (and not attached):
1 tools_3.2.1
我只看了你问题的一行就停在那里了:
I have some strange troubles with Rcpp - it uses unpredictable C++ compiler
这既是 错误的 也是煽动性的。请阅读您的 R 版本附带的 R 文档并了解 R 如何设置这些内容。
Rcpp 没有做任何额外的事情。所有这些都是默认的 R 行为:
作为用户,您可以在 ~/.R/Makevars
中进行设置
作为一个针对可移植和 CRAN 兼容包的包作者,你不得不在包构建时使用,比如说,configure
。
这一切都记录在案并且有
之前讨论过。
感谢@Dirk 的提示,我终于得到了答案。希望,这会为某人节省一点时间。
~/.R/Makevars
中的两行解决了我的问题:
CXX1X=clang-omp++
查看 this Writing R Extensions section 中的详细信息。
我在使用 Rcpp 时遇到了一些奇怪的问题 - 它使用了不可预测的 C++ 编译器。这道题有点类似于this question.
我在 OSX,我有 2 个编译器 - 默认 clang
和 clang-omp
,支持 openmp。我还有以下 ~/.R/Makevars
文件(我将 clang-omp
设置为默认编译器):
CC=clang-omp
CXX=clang-omp++
CFLAGS += -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS += -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp
问题是,我正在开发的包使用 clang++
而不是 clang-omp++
进行编译。我还尝试(作为解决问题的实验)更改包 src/Makevars
并设置 CXX=clang-omp++
并且修改 $R_HOME/etc/Makeconf
CXX
条目到 CXX = clang-omp++
。运气不佳 - 它仍然使用 clang++
编译。不知道为什么会这样。
这里还有一个可重现的小例子(来自控制台 R 和 Rstudio)(不知道它是否与上述问题有关)。
假设 2 个非常相似的 cpp 函数:
1.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
}
从 R:
调用sourceCpp
library(Rcpp)
sourceCpp("src/Rcpp_compiler.cpp", verbose = T)
/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB -o 'sourceCpp_1.so' 'Rcpp_compiler.cpp'
clang-omp++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Users/dmitryselivanov/Library/R/3.2/library/Rcpp/include" -I"/Users/dmitryselivanov/projects/experiments/src" -fPIC -Wall -mtune=core2 -g -O2 -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp -c Rcpp_compiler.cpp -o Rcpp_compiler.o
clang-omp++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o sourceCpp_1.so Rcpp_compiler.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
按预期工作 - 使用 clang-omp++ 和来自 ~/.R/Makevars
2.
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
return x * 2;
}
Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB -o 'sourceCpp_2.so' 'Rcpp_compiler.cpp'
clang++ -std=c++11 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Users/dmitryselivanov/Library/R/3.2/library/Rcpp/include" -I"/Users/dmitryselivanov/projects/experiments/src" -fPIC -Wall -mtune=core2 -g -O2 -c Rcpp_compiler.cpp -o Rcpp_compiler.o
clang++ -std=c++11 -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o sourceCpp_2.so Rcpp_compiler.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation
我只添加了 // [[Rcpp::plugins(cpp11)]]
并且它使用 clang++
而不是 clang-omp++
这是我的 sessionInfo()
:
R version 3.2.1 (2015-06-18) Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.10.5 (Yosemite)
locale: 1 en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages:
1 stats graphics grDevices utils datasets methods base
other attached packages: 1 Rcpp_0.12.1
loaded via a namespace (and not attached): 1 tools_3.2.1
我只看了你问题的一行就停在那里了:
I have some strange troubles with Rcpp - it uses unpredictable C++ compiler
这既是 错误的 也是煽动性的。请阅读您的 R 版本附带的 R 文档并了解 R 如何设置这些内容。
Rcpp 没有做任何额外的事情。所有这些都是默认的 R 行为:
作为用户,您可以在
~/.R/Makevars
中进行设置
作为一个针对可移植和 CRAN 兼容包的包作者,你不得不在包构建时使用,比如说,
configure
。
这一切都记录在案并且有 之前讨论过。
感谢@Dirk 的提示,我终于得到了答案。希望,这会为某人节省一点时间。
~/.R/Makevars
中的两行解决了我的问题:
CXX1X=clang-omp++
查看 this Writing R Extensions section 中的详细信息。