2015-10-06 64 views
3

我正在開發Mac OSX上的R包,其中包含一些低級C/C++代碼和openMP支持。 C++代碼是使用Rcpp包編寫的。我的全球''Makevars''文件被放置在~/.R/文件夾下。該文件如下所示。使用C/C++和openMP的R包:如何在「mypackage/src /」文件夾下創建「Makevars」文件?

CC=clang-omp 
CXX=clang-omp++ 

PKG_CFLAGS=Wall -pedantic 
PKG_CFLAGS= -fopenmp 
PKG_CXXFLAGS= -fopenmp 
PKG_LIBS= -fopenmp -lgomp 

在這個配置下一切都很好!

但是,現在我想爲自己的編譯構建特定於包的文件Makevars,以使包可移植。我所嘗試的僅僅是將全球Makevars文件移動到我的R pakcage src文件夾中。然而,編譯器抱怨它無法找到OpenMP的頭文件omp.h

** libs 
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/bigmemory/include" -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/BH/include" -fopenmp -fPIC -Wall -mtune=core2 -g -O2 -c RcppExports.cpp -o RcppExports.o 
RcppExports.cpp:12:10: fatal error: 'omp.h' file not found 
#include <omp.h> 
     ^
1 error generated. 
make: *** [RcppExports.o] Error 1 
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/bigmemory/include" -I"/Library/Frameworks/R.framework/Versions/3.2/Resources/library/BH/include" -fopenmp -fPIC -Wall -mtune=core2 -g -O2 -c RcppExports.cpp -o RcppExports.o 
RcppExports.cpp:12:10: fatal error: 'omp.h' file not found 
#include <omp.h> 
     ^
1 error generated. 
make: *** [RcppExports.o] Error 1 

正如你所看到的,編譯器成爲clangclang++,但不是在Makevars文件中指定的內容:CC=clang-ompCXX=clang-omp++

問題1:那麼我該如何解決這個問題並在R包中構建一個Makevars文件?

的另一件事是,我從Writing R extensions注意到,

For example, a package with C code written for OpenMP should have in src/Makevars the lines 

PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS) 
PKG_LIBS = $(SHLIB_OPENMP_CFLAGS) 

問題2:是什麼,例如之間的差異,宏觀$(SHLIB_OPENMP_CFLAGS)和標誌-fopenmp?哪一種情況下我應該使用?我試圖用宏替換標誌,但仍然無法解決問題。

回答

3

關於問題,我最喜歡的方法是從工作包複製。下面是例如部分從(推薦/核心)封裝mgcv:

PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) $(SHLIB_OPENMP_CFLAGS) 
PKG_CFLAGS = $(SHLIB_OPENMP_CFLAGS) 

我自己和Andreas使用在較小winsorize包相同的片斷(在GitHub)。

關於問題2:第一種形式更通用,並且允許其他OpenMP實現。它使用R發現配置時可用的內容。

+0

謝謝你的回答,德克。關於問題1,我的問題是,如果我把''Makevars''放在''/ src /''文件夾下,而不是默認的''〜/ .R'',那麼使用''clang-omp' '和''clang-omp ++''編譯器不起作用,如錯誤消息所示。你有什麼線索嗎?這個問題似乎與我如何設置標誌(或宏)無關。 –

+0

你似乎很困惑。忘記包裝的'〜/ .R/Makevars'。它需要的所有內容必須位於src/Makevars中,並且(在CRAN包中)必須是可移植的。所以不要以爲你會得到'clang-ANYTHING'。如果必須的話,通過'configure'測試它。r-package-devel列表可能會有所幫助。 –

0

聽起來你需要像德克描述的包裹Makevars;對於您的本地環境,請使用CC和CXX將〜/ .R/Makevars設置爲啓用OpenMP的版本的C和C++編譯器。

您的軟件包(如果註定要用於CRAN,並且事實上任何沒有與安裝OpenMP版本的鏗鏘作戰的Mac R用戶)都需要在沒有OpenMP的情況下工作,所以您的代碼和編譯器標誌可能不應該假設它存在。

相關問題