使用Rcpp将目标文件链接到函数的简化示例

时间:2018-06-09 04:09:01

标签: rcpp

我有现有的C代码,包含三个文件:头文件(“.h”文件),库文件(“.o”文件)和源文件。它们目前在UNIX下运行,并在Matlab中编译为“mex文件”。我想用Rcpp将它们移植到R.它们都很复杂,所以我做了一个小例子来帮助我理解如何将它们移植到R。

简化的头文件(my_header.h)是:

typedef unsigned int    ui4;
ui4  add_one( ui4 );

简化的“库”文件(my_lib.cpp)是:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "my_header.h"

ui4 add_one(ui4 x) {
        return(x+1);
}

简化的函数程序(my_program.cpp)是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <Rcpp.h>
#include <cmath>

#include "my_header.h"

using namespace Rcpp;

// [[Rcpp::export]]
ui4 my_program_r () {
//int main (int argc, const char * argv[]) {
//
// As a MATLAB mex file, this function calls "main(..."
//
  ui4 value = add_one( (ui4)1 );
  printf( "%d", value );
  return value;
}

从终端(我在Mac上),我可以编译这些没有错误:

$ g++ my_lib.cpp -c -o my_lib.o
$ g++ my_program.cpp -o my_program my_lib.o

当我尝试在RStudio中编译它们时,我得到:

> library(Rcpp)
> sourceCpp( "my_program.cpp" )
Warning message:
In sourceCpp("my_program.cpp") :
  No Rcpp::export attributes or RCPP_MODULE declarations found in source
> 

为什么不在Rcpp下进行编译?如何在“sourceCpp”命令中指定链接文件(“.o”库文件)?我是否需要指定头文件?

1 个答案:

答案 0 :(得分:1)

sourceCpp命令仅适用于单个文件。如果您有多个文件,则必须使用包:

  • 致电Rcpp::Rcpp.package.skeleton(...)以创建骨架包。
  • *.h*.c*.cpp复制到src文件夹。
  • 致电Rcpp::compileAtrributes()
  • 使用R CMD build ...R CMD check ...R CMD INSTALL ...构建,检查和编译软件包。 (check会抱怨未记录的函数......)

有关详细信息,请参阅Rcpp-package小插图,例如this question。顺便说一句,由于R没有unsigned int类型,我不确定您的返回值是否有效。您可能需要切换为intdouble。我也收到了与您不同的错误消息:

  

dyn.load中的错误(“/ tmp / RtmpSbvXHx / sourceCpp-i686-pc-linux-gnu-0.12.17 / sourcecpp_625ad24a943 / sourceCpp_2.so”):     无法加载共享对象'/tmp/RtmpSbvXHx/sourceCpp-i686-pc-linux-gnu-0.12.17/sourcecpp_625ad24a943/sourceCpp_2.so':     /tmp/RtmpSbvXHx/sourceCpp-i686-pc-linux-gnu-0.12.17/sourcecpp_625ad24a943/sourceCpp_2.so:unfined defined symbol:_Z7add_onej

您确定上述代码与您使用的完全相同吗?