繁体   English   中英

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

[英]R package with C/C++ and openMP: how to make “Makevars” file under “mypackage/src/” folder?

我正在Mac OSX上开发带有一些低级C/C++代码和openMP支持的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 <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文件?

另一件事是,从编写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:第一种形式较为通用,将允许其他OpenMP实现。 它使用R在配置时发现可用的东西。

听起来您需要Dirk描述的Makemakes软件包。 对于您的本地环境,请〜/ .R / Makevars使用CC和CXX将C和C ++编译器设置为启用OpenMP的版本。

您的软件包(如果运用于CRAN,并且确实有没有为安装OpenMP版本的clang而战的所有Mac R用户)将不需要OpenMP,因此您的代码和编译器标志可能不应该假定其存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM