【问题标题】:Rcpp and default C++ compilerRcpp 和默认 C++ 编译器
【发布时间】:2016-01-17 18:15:48
【问题描述】:

我在使用 Rcpp 时遇到了一些奇怪的问题——它使用了不可预测的 C++ 编译器。这个问题有点类似于this question。
我在 OSX 上,我有 2 个编译器 - 默认 clang 和 clang-omp 支持 openmp。我还有以下~/.R/Makevars 文件(我将clang-omp 设置为默认编译器):

CC=clang-omp
CXX=clang-omp++
CFLAGS += -O3 -Wall -pipe -pedantic -std=gnu99
CXXFLAGS += -O3 -Wall -pipe -Wno-unused -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;
}  

从 R 致电 sourceCpp:

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/库/Rcpp/include"-I"/Users/dmitryselivanov/projects/experiments/src"-fPIC -Wall -mtune=core2 -g -O2 -O3 -Wall -pipe -Wno-unused -pedantic -fopenmp -c Rcpp_compiler。 cpp -o Rcpp_compiler.o
clang-omp++ -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_1.so Rcpp_compiler.o -F/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

按预期工作 - 使用 clang-omp++ 和我来自 ~/.R/Makevars 的所有标志

2.

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
  return x * 2;
}  

Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB -o 'sourceCpp_2.so' 'Rcpp_compiler.cpp'
clang++ -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
clang++ -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/Library/Frameworks/R.framework/.. -framework R -Wl,-framework -Wl,CoreFoundation

我只添加了// [[Rcpp::plugins(cpp11)]],它编译为clang++而不是clang-omp++

这是我的sessionInfo():

R 版本 3.2.1 (2015-06-18) 平台:x86_64-apple-darwin13.4.0(64位)
运行于:OS X 10.10.5 (Yosemite)
语言环境: 1 en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 附加的基础包:
1 stats graphics grDevices utils datasets methods base
其他附加包: 1Rcpp_0.12.1
通过命名空间加载(未附加): 1tools_3.2.1

【问题讨论】:

    标签: r macos rcpp clang++


    【解决方案1】:

    我只看了你的问题的一行就停在那里:

    我在使用 Rcpp 时遇到了一些奇怪的问题——它使用了不可预测的 C++ 编译器

    这既是错误的,也是煽动性的。请阅读您的 R 版本中包含的 R 文档,并了解 R 如何设置这些内容。

    Rcpp 没有做任何额外的事情。所有这些都是默认的 R 行为:

    • 作为用户,您可以在~/.R/Makevars中进行设置

    • 作为旨在开发可移植且与 CRAN 兼容的软件包的软件包作者,您必须在构建软件包时使用 configure。

    所有这些都已记录在案并具有 之前讨论过。

    【讨论】:

    • 像往常一样不是很友好的回应,但在又挖了半天后,我得到了解决方案。将通过我的小修改来接受您的回答,这实际上解决了我的问题。
    • 你可以直接来 rcpp-devel(或者对于这个甚至 r-package-devel,因为你有 packaging 而不是 Rcpp 问题)并在那里提问。
    • 如果您现在有答案,请随时添加或编辑您的问题。很高兴看到为什么检查“编写 R 扩展”的建议对您很有帮助。
    • 邮件列表适合这类问题吗?为什么不呢?
    【解决方案2】:

    感谢@Dirk 的提示,我终于得到了答案。希望,这将为某人节省一点时间。 ~/.R/Makevars 中的以下两行解决了我的问题:

    CXX1X=clang-omp++
    

    查看详情在this Writing R Extensions section。

    【讨论】:

    • 当然,你不会希望那些制造标志进入 CRAN。我已经尝试将 C++11 和 OpenMP 用于 CRAN 包,发现您几乎肯定需要一个“配置”脚本。
    • 别想,这是个问题。我们可以将C++11 添加到SystemRequirements 并使用#ifdef _OPENMP 宏检查omp 支持。如果不支持 - 使用单线程。无论如何,昨天,我用RcppParallel 重写了我所有的并发部分,它更健壮、更便携——甚至可以在 Windows 上运行。
    • 什么是 CXX1X ? Writing R Extensions 将 CXX11 称为 make 变量指令,以便为包使用 C++11 编译器。我正在寻找解释 CXX1X 是什么的文档,但只能找到有关 CXX11、CXX14、CXX17 的信息。
    • 自 R 3.4 以来已更改。之前是 CXX1X。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多