在Rcpp中包含fortran函数

时间:2014-10-27 18:53:39

标签: c++ r fortran rstudio rcpp

这最初在我看来是一个简单的任务,但我无法让以下工作。我试图将一个fortran子例程包装到Rcpp调用中,以便在R中使用该函数。目标是将函数合并到一个包中,所以在特定的* .so文件中使用dyn.load()的想法是不可行的(除非有人可以告诉我如何?)。从阅读类似的帖子,我怀疑在makevars文件中指定标志可以解决问题,但提供的信息非常简洁here,并且真诚地感谢一些澄清。

我已经完成了以下文件,因为我可以遵循文件。

  1. 使用Rcpp.package.skeleton
  2. 创建包结构
  3. 将我的fortran文件(hello.f)放在src目录中
  4. 为Rcpp包装器创建了一个基本的cpp文件(hello.cpp)
  5. 创建一个R文件以创建一个' clean'函数调用(即避免用户.Call并允许在.Call之前运行其他内部计算
  6. 然而,当我尝试构建我的包(使用RStudio)时,我得到以下错误输出:

    ==> R CMD INSTALL --no-multiarch --with-keep.source fortran
    
    g++ -shared -o fortran.so RcppExports.o hello.o hello.o rcpp_hello_world.o -lgfortran -lm -lquadmath -L/usr/lib/R/lib -lR
    * installing to library ‘/home/.../R/x86_64-pc-linux-gnu-library/3.0’
    * installing *source* package ‘fortran’ ...
    ** libs
    hello.o: In function `hello_wrapper':
    /home/.../r_code/fortran/src/hello.cpp:16: multiple definition of `hello_wrapper'
    hello.o:/home/.../r_code/fortran/src/hello.cpp:16: first defined here
    collect2: error: ld returned 1 exit status
    make: *** [fortran.so] Error 1
    ERROR: compilation failed for package ‘fortran’
    * removing ‘/home/.../R/x86_64-pc-linux-gnu-library/3.0/fortran’
    
    Exited with status 1.
    

    我的文件如下:

    hello.f

    subroutine hello()
        print *, "hello world"
    end subroutine hello
    

    hello.h

    extern "C"
    {
      void hello();
    }
    

    HELLO.CPP

    #include <R.h>
    #include <Rinternals.h>
    #include <Rdefines.h>
    
    #include "hello.h"
    
    #ifdef __cplusplus
    extern "C"
    {
      SEXP hello_wrapper();
    }
    #endif
    
    SEXP
    hello_wrapper ()
    {
      hello();
    }
    

    wrapper.R

    hello_r <- function(){
      .Call("hello_wrapper");
    }
    

3 个答案:

答案 0 :(得分:2)

我认为,当您使用不同的扩展名包含多个名称文件时,问题就像R不满意一样简单。尝试将hello.f重命名为hello_fortran.f并从那里开始。

答案 1 :(得分:1)

我认为如果您删除

,这可能会有效
#ifdef __cplusplus
extern "C"
{
  SEXP hello_wrapper();
}
#endif

一部分。另请参阅Rcpp属性小插图 - 您不需要手动编写wrapper.R

答案 2 :(得分:0)

Rcpp函数和.Fortran不能同时存在。 不要在src/RcppExports.cpp中包含Fortran函数。