首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rcpp将对象文件链接到函数的简化示例

使用Rcpp将对象文件链接到函数的简化示例
EN

Stack Overflow用户
提问于 2018-06-09 04:09:00
回答 1查看 477关注 0票数 0

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

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

代码语言:javascript
复制
typedef unsigned int    ui4;
ui4  add_one( ui4 );

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

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "my_header.h"

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

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

代码语言:javascript
复制
#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上),我可以编译这些内容,而不会出错:

代码语言:javascript
复制
$ g++ my_lib.cpp -c -o my_lib.o
$ g++ my_program.cpp -o my_program my_lib.o

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

代码语言:javascript
复制
> 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下编译呢?如何在".o“命令中指定链接文件( "sourceCpp”库文件)?我需要指定头文件吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 05:47:51

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

  • 调用Rcpp::Rcpp.package.skeleton(...)创建一个框架包。
  • *.h*.c*.cpp复制到src文件夹。
  • 打给Rcpp::compileAtrributes()
  • 使用R CMD build ...R CMD check ...R CMD INSTALL ...构建、检查和编译包。( check会抱怨没有文档的函数.)

有关更多细节,请参见Rcpp-包 vignette,例如这个问题。顺便说一句,由于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:未定义符号:_Z7add_onej

您确定上面的代码正是您所使用的吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50770830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档