gpt4 book ai didi

c - 带有 C/C++ 和 openMP 的 R 包 : how to make "Makevars" file under "mypackage/src/" folder?

转载 作者:太空狗 更新时间:2023-10-29 15:28:46 25 4
gpt4 key购买 nike

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

另一件事是,我从 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 之间有什么区别?我应该在什么情况下使用哪一个?我尝试用宏替换标志,但仍然无法解决问题。

最佳答案

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

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

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

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

关于c - 带有 C/C++ 和 openMP 的 R 包 : how to make "Makevars" file under "mypackage/src/" folder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32974568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com