我對Rcpp有一些奇怪的麻煩 - 它使用不可預測的C++編譯器。這個問題有點類似於this question。
我在OSX上,我有2個complilers - 默認clang
和clang-omp
與openmp支持。還我具有以下~/.R/Makevars
文件(其中,我建立clang-omp
作爲默認的編譯器):Rcpp和默認的C++編譯器
CC =鐺-OMP
CXX =鐺-OMP ++
CFLAGS + = -O3 -Wall -pipe -pedantic -std = gnu99
CXXFLAGS + = -O3 -pipe -Wall -Wno-未使用-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;
}
呼叫sourceCpp
從R:
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 =核2 -g -O2 -O3 -Wall -pipe -Wno非佔線-pedantic -fopenmp -c Rcpp_compiler.cpp -o Rcpp_compiler.o
鐺-OMP ++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined壓縮-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輪候冊,的CoreFoundation
按預期 - 使用鐺 - OMP ++和我所有的標誌從~/.R/Makevars
2.
庫/框架/ R.framework /資源/倉/ R CMD SHLIB -o 'sourceCpp_2.so' 'Rcpp_compiler.cpp'
鐺++ -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
鐺++ -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 /庫/框架/ R.framework/.. -frameworkř-Wl,-framework -Wl,的CoreFoundation
我只加// [[Rcpp::plugins(cpp11)]]
並將其與clang++
代替編譯clang-omp++
這是我的sessionInfo()
:
ř版本3.2.1(2015年6月18日) 平臺:x86_64的-蘋果darwin13.4.0(64位)
下運行:OS X 10.10.5(約塞米蒂)
區域設置: 1的en_US.UTF-8 /的en_US.UTF-8 /的en_US.UTF-8/C /的en_US.UTF-8 /的en_US.UTF-8 附基礎包:
1統計圖形grDevices utils的數據集的方法基礎
其他附加包: 1 Rcpp_0.12.1
通過命名空間加載(而不是atta高等教育委員會): 1 tools_3.2.1
當然,你將沒有希望在地球上製造旗幟到CRAN。我一直試圖使用C++ 11和OpenMP來構建一個CRAN包,並發現你幾乎可以肯定需要一個'configure'腳本。 –
不要以爲這是一個問題。我們可以在'SystemRequirements'中添加'C++ 11'並使用'#ifdef _OPENMP'宏檢查omp支持。如果它不支持 - 去單線程。無論如何,昨天,我用'RcppParallel'重寫了我所有的併發部分,這個功能更強大,更便攜 - 甚至可以在Windows上運行。 –
讓我們知道這是怎麼回事... –