c++ - 如何从 C API 保存 R 对象

标签 c++ c r

我需要将 R 表达式保存到文件中,本质上

save( x, file="myfile.Rdata")

但是,我需要从 C/C++ API 执行此操作(因为“x”的值是由 C++ 函数计算的,该函数作为 R 的插件加载)。在网上研究了这个问题后,没有找到任何有用的东西,我深入研究了代码,发现 src/main/saveload.c 中有一个函数“do_save”

SEXP attribute_hidden do_save(SEXP call, SEXP op, SEXP args, SEXP env)

当我在 R 中输入“save”时,这就是 .Internal 完成所有工作,但显然我无法将生成的插件正确链接到 R,我收到错误消息:

> dyn.load( "Plugin.so" )
Error in dyn.load("new-plugin/Plugin.so") :
  unable to load shared object 'Plugin.so':
  Plugin.so: undefined symbol: _Z7do_saveP7SEXPRECS0_S0_S0_

一般来说,应该如何在 C API 中使用这些内部函数,或者换句话说,应该如何从 C API 评估内置 R 函数?

最佳答案

当您编写 C++ 函数时,二进制文件中的函数名称会发生​​更改或“损坏”,以允许函数重载起作用。为了避免这种情况,您可以使用 extern "C",如果您没有真正使用任何 C++ 特定语法或功能,则可以使用 C 编译器。

对于第一个修复,它会像这样,

extern "C" SEXP attribute_hidden do_save(SEXP call, SEXP op, SEXP args, SEXP env);

第二个可能的修复方法是重命名源文件以具有 .c 扩展名并使用 C 编译器进行编译,如果它不是 C++ 代码,它将编译并且您不需要 extern “C”

关于c++ - 如何从 C API 保存 R 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604513/

相关文章:

c - 包含来自静态库的头文件

r - R 中的条件计算

r - 在 R 中将自由之家索引转换为整洁的格式

C++:链接器错误: undefined reference 仅对单独文件中定义的一个特定类成员

c - 如何将结构显式对齐为 4 个字节

c - malloc 未使用指向指针的指针正确分配

r corrplot 与聚类 : default dissimilarity measure for correlation matrix

c++ - 将 int 添加到 size_t 的正确方法

c++ - fatal error : opencv2/core. hpp:在 opencv4 中没有这样的文件或目录编译终止

c++ - 如何使用 Gmock 模拟不带运算符 == 的函数参数