如何在Rcpp内联中包含本地头文件,而不对目录进行硬编码?

时间:2012-04-07 20:42:41

标签: r rcpp

我有一个带有内联C ++的R脚本,我想在同一目录中包含一个头文件。我可以得到以下工作:

library(Rcpp)
library(inline)

code <- '
   // my C++ code here
   '

settings=getPlugin("Rcpp")
settings$env$PKG_CXXFLAGS='-I /hard/coded/path/to/header/'

myfunction <- cxxfunction(signature(x="numeric"),
                          plugin="Rcpp",  include='#include "myheader.hpp"',
                          settings=settings, body=code)

但似乎应该有一种方便的方法将头文件包含在同一目录中。我只是看不出它是什么。我真的想要一种方法来包含位于同一目录中的c ++文件。

(道歉:我不是c ++(或R)忍者,所以我可能会遗漏一些非常明显的东西。

1 个答案:

答案 0 :(得分:1)

当您说“在同一目录中”时,您能说明您所引用的目录吗?什么相同?

如果它是当前目录,您仍然需要-I.,因为该目录可能不会作为默认添加。但如果那确实是你想要的目录,那么它的相对路径(说“当前目录”)比绝对-I/hard/coded/path/to/header更通用。

否则,您所做的就是修改插件以向编译器提供额外标志的正确方法。

编辑:进行了一两次测试后发现inline包始终使用R的tempdir进行编译 - 所以-I.没有任何意义,因为我们通常会这样做不知道那是哪里。

这给你两个选择:

  1. 使用绝对路径。

  2. 使用R将头文件的内容读入传递给include=参数的变量。

  3. 编辑2:原来我们在Rcpp本身附带的一个示例中执行此操作:

    settings <- getPlugin("Rcpp")
    settings$env$PKG_CXXFLAGS <- paste("-I", getwd(), sep="")
    

    然后在调用cxxfunction时使用settings = settings。