2015-10-19 105 views
4

我對Rcpp有一些奇怪的麻煩 - 它使用不可預測的C++編譯器。這個問題有點類似於this question
我在OSX上,我有2個complilers - 默認clangclang-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/MakeconfCXX進入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

回答

7

感謝@Dirk提示,我最終得到了答案。希望,這會爲某人節省一點時間。 以下兩行~/.R/Makevars解決我的問題:

CXX1X=clang-omp++ 

詳情請參閱this Writing R Extensions section

+1

當然,你將沒有希望在地球上製造旗幟到CRAN。我一直試圖使用C++ 11和OpenMP來構建一個CRAN包,並發現你幾乎可以肯定需要一個'configure'腳本。 –

+1

不要以爲這是一個問題。我們可以在'SystemRequirements'中添加'C++ 11'並使用'#ifdef _OPENMP'宏檢查omp支持。如果它不支持 - 去單線程。無論如何,昨天,我用'RcppParallel'重寫了我所有的併發部分,這個功能更強大,更便攜 - 甚至可以在Windows上運行。 –

+1

讓我們知道這是怎麼回事... –

2

我只看過你的問題的一行並停止:

我有RCPP一些奇怪的麻煩 - 它使用不可預知的C++編譯器

這就是錯了也是炎症。請閱讀R版本附帶的R文檔,瞭解R如何設置這些內容。

Rcpp沒有做任何額外的事情。這一切都是默認的[R行爲:

  • 正如你可以設置這~/.R/Makevars

  • 作爲一個包的作者,旨在爲便攜式和CRAN兼容包一個用戶,你不能不使用,也就是說,configure在建包時間。

這是所有記錄和 以前討論。

+8

像往常一樣不是很友好的迴應,但挖掘了一天的另一半後,我得到解決方案。將接受你的答案,我的小修改實際上解決了我的問題。 –

+0

你可以來到rcpp-devel(或者你甚至可以使用_packaging_而不是rcpp的問題),並在那裏詢問。 –

+0

如果您現在有答案,請隨時添加或編輯您的問題。很高興看到爲什麼檢查「Writing R Extensions」的建議對您而言是富有成效的。 –