【问题标题】:Use another compiler when install R packages with Rcpp and CMake使用 Rcpp 和 CMake 安装 R 包时使用另一个编译器
【发布时间】:2017-12-03 18:47:15
【问题描述】:

我在做什么我正在使用 Rcpp 和 CMake 为 C++ 代码开发一个 R 接口/包。因为应该支持openmpc++11,所以我对编译器有偏好。

问题 我知道我总是可以将 Makevars 放在 ~/.R (Unix) 下,以更改 R 在安装软件包时使用的编译器。但作为开发者,不建议这样做。

建议使用configure 文件来执行此操作。但是,我不太清楚如何实现这一点,因为我正在自己编写configure 文件并在我的configure 中调用cmake。我不知道在configure 文件中写什么来搜索特定的编译器。

希望描述清楚。谢谢。

我在下面附上了我的configure 文件内容。

```

set -x
set -e

which cmake

rm -rf _builds

# call cmake that will set compiler flags in src/Makevars
# and download dependencies
cmake -H. -B_builds

```

【问题讨论】:

  • 如果你使用 cmake,你不应该使用配置脚本。
  • 那么,安装时应该如何配置编译标志呢?我这样做是因为R-cpp core group 建议
  • OpenMP 和 C++11 在 R 本身支持的所有平台上都默认支持。如果您安装了推荐的工具链,则包括 macOS。你的所作所为让我觉得是错误的。
  • @DirkEddelbuettel 我想我不太明白OpenMP and C++11 are supported by default on all platforms supporting it by R itself 的意思。我确实了解 R 可以通过创建多个进程来实现并行化,所有平台都支持这一点。但我的经验是,如果您使用clang 编译器来安装/编译需要-fopenmp 标志的软件包,它将失败。就我而言,这正是我想做的。我的 C++ 代码需要 -fopenmp 支持,我想找到一种方法来更改 R CMD 系统使用的编译器。谢谢!

标签: cmake rcpp configure autoconf


【解决方案1】:

我使用 CMake 构建 R 包已经有一段时间了,请参阅 https://github.com/rohan-shah/mpMap2 获取示例。

不过,我完全绕过了 R 构建系统,所以我根本不使用 configure。

【讨论】:

  • 其实,没有人强制使用configure。但即使是基于 CMake 的构造也使用 R CMD INSTALL,因此编译器 R 使用。 OP 想要的是可能的,但很困难,通常不推荐。
  • 不正确。正如我所说,CMake 构建系统完全绕过了 R 构建系统。我设计的,我应该知道。在这种情况下,R CMD INSTALL 不用于编译任何内容。
  • 你通过cmake 打电话给R CMD INSTALL,不是吗?
  • 是的,在这种情况下只复制文件。我鼓励你在 linux 上安装包 rohan-shah/mpMap2 看看它是如何工作的。
  • 非常感谢你们。将检查解决方案。
【解决方案2】:

据我了解,您想检测编译器是否支持 openmp 和 C++11。

有许多现有的包使用configure 来检测对openmp 的支持。一个例子是ARTP2(https://github.com/zhangh12/ARTP2/blob/master/configure.ac),在“编写R扩展”中已经作为例子提到过。您也可以使用我 (https://github.com/dmlc/xgboost/blob/master/R-package/configure.ac) 在 xgboost 中的配置脚本作为示例。如果编译器不支持 openmp,我们将 OPENMP_CXXFLAGS 留空。

对于 C++11 的支持,你可以试试AX_CXX_COMPILE_STDCXX_11。但这需要新版本的 autoconf。

我想你也可以试试AC_PROG_CXX 来选择编译器,比如icc

【讨论】:

  • 感谢您的 cmets。所以如果我要在配置文件中做所有事情。我是否使用 autoconf 生成配置文件并将配置文件放在不同的平台上?谢谢。
  • 是的,这正是 autoconf 的意义所在。
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2012-10-07
  • 2014-06-25
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多