如何在 R 负载表中注册 C 符号?
How can I register C symbols in the R load table?
这不起作用
关于如何在没有 Rcpp 的情况下在 R 中包含 C 和 C++ 代码,有各种手册。按照本手册中的第一个示例编写 c++ 函数
void double_me(int* x) {
// Doubles the value at the memory location pointed to by x
*x = *x + *x;
}
到文件中doubler.cpp
和编译
R CMD SHLIB doubler.cpp
工作正常。该过程会导致其他文件doubler.o
和doubler.so
。共享对象可以从 R 加载,但不注册符号double_me
它应该公开:
> dyn.load("doubler.so")
> getLoadedDLLs()
Filename
base base
methods /usr/lib/R/library/methods/libs/methods.so
utils /usr/lib/R/library/utils/libs/utils.so
grDevices /usr/lib/R/library/grDevices/libs/grDevices.so
graphics /usr/lib/R/library/graphics/libs/graphics.so
stats /usr/lib/R/library/stats/libs/stats.so
doubler /home/<user>/<path>/src/doubler.so
tools /usr/lib/R/library/tools/libs/tools.so
Dynamic.Lookup
base FALSE
methods FALSE
utils FALSE
grDevices FALSE
graphics FALSE
stats FALSE
doubler TRUE
tools FALSE
> getDLLRegisteredRoutines("doubler")
data frame with 0 columns and 0 rows
因此
> .C("double_me", as.integer(1))
Error in .C("double_me") : C symbol name "double_me" not in load table
显然,缺少一些东西 - 大概是加载表中符号(函数名称)的注册。
这有效,但很难理解,如何
根据本手册,我们应该应用
extern "C" {
}
到另一个文件中的第三个函数。在手册中,这是一个X_main.o
函数,与加载的库(X.so
)一起编译,显然是在加载表中注册的,而从未被显式加载。然后仍然可以用.C("X_main")
调用它。
我不确定这究竟是如何工作的,或者如何将其应用于具有微不足道double_me函数的第一个示例。
相关问题
在Stackoverflow上有很多问题可能与此有关。 不幸的是,他们都没有一个解释清楚的答案。例子是这个,这个,这个和这个。
C++允许重载,您可以在其中使用具有不同参数的相同函数。为了实现这一点,它们必须在编译文件中具有不同的名称。因此,当您将void double_me(int* x)
声明为C++函数时,它实际上将被编译为名称上带有可怕后缀的内容。有关详细信息,请参阅示例 https://sourceware.org/binutils/docs/binutils/c_002b_002bfilt.html。如果指定 C 链接,则不会发生名称重整,并且它会以相当正常的名称获得输出。
回到你的问题,你想从R调用的函数可能应该有C链接。就是这样。您对需要第三个功能等感到困惑。只要double_me
标记为外部"C",你就会一切都好起来的。
即使如此,您可能需要向 R 注册函数.....
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 无法将结构注册为增强几何体3D点
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何使用AngelScript注册SFML Vector2运算符
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- 在遍历处理程序的向量时注册和注销处理程序
- 检查TCHAR数组输入是否为带符号整数C++
- 如何在 R 负载表中注册 C 符号?
- 如何删除注册表中拙劣的符号链接