R包与C / C ++和openMP:如何在“mypackage / src /”文件夹下制作“Makevars”文件?

我正在使用一些低级C/C++代码和openMP支持在Mac OSX上开发R包。 C++代码是使用Rcpp包编写的。 我的全局”Makevars”文件放在~/.R/文件夹下。 该文件如下所示。

 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  ^ 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  ^ 1 error generated. make: *** [RcppExports.o] Error 1 

如您所见,编译器变为clangclang++ ,但不是Makevars文件中指定的: CC=clang-ompCXX=clang-omp++

问题1:那么如何解决这个问题并在R包中构建Makevars文件?

另一件事是,我注意到写作R扩展 ,

 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什么-fopenmp ? 我应该在哪种环境下使用? 我试图用宏替换标志,但仍然无法解决问题。

关于问题,我最喜欢的方法是从工作包复制。 这是例如(推荐/核心)包mgcv的部分:

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

我自己和Andreas在较小的winsorize包(在GitHub上)使用相同的片段。

关于问题2:第一种forms更通用,并允许其他OpenMP实现。 它使用R在配置时发现可用的内容。

听起来你需要像Dirk描述的Makevars包; 对于您的本地环境,让〜/ .R / Makevars使用CC和CXX将C和C ++编译器设置为支持OpenMP的版本。

您的程序包(如果发往CRAN,实际上任何没有与安装OpenMP版本的clang作斗争的Mac R用户)将需要在没有OpenMP的情况下工作,因此您的代码和编译器标志可能不应该假设其存在。