gcc - 构建 R 包时如何链接静态库

标签 gcc compiler-construction r static-libraries

我正在创建一个将由 R(统计程序)使用的包,我不是使用此应用程序的专家,但我已经设法创建了一个非常简单的包,使用以下逻辑,我有C++ 中的一些类,因为代码必须使用 R 编译器编译并且它只允许 C 代码,我有一个包装器 C 代码调用 C++ 方法,后来我有一个 R 脚本调用 C 公开的方法代码,所以基本上是像 R <-> C<->C++ 这样的通信。

可以找到我用来创建这个包的完整教程 here ,我将其添加为引用。

现在我的问题是我需要向我已经创建的包中添加一些功能,我需要做的是添加用于后期绑定(bind)到 COM 对象的代码,该对象是我创建的另一个产品,使用高潮工具。

这是我用来尝试延迟绑定(bind)到 COM 对象的 C++ 代码,我正在尝试使用 IDispatch 来这样做:

{
...
CLSID clsid;    
HRESULT hr = CLSIDFromProgID((WCHAR*)"My Com object ProgId", &clsid);
if(FAILED(hr))                      
  return;   
...     
}

我没有粘贴整个代码,因为只有这些行,编译器已经给我带来麻烦了,我用来编译的命令是

R CMD SHLIB Cclass.cc C++class.cc

其中“Cclass.cc”包含调用c++方法的C代码,而“C++class.cc”实际上是C++代码。

当我编译这些类时,编译器说

"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"

我确定我已经添加了我需要的所有头文件,这就是为什么我认为我的问题是我没有包括静态库 ole32.lib 和 oleaut32.lib。

所以,我的问题是,我怎样才能包含这个库以便能够使用后期绑定(bind)的方法,例如 CLSIDFromProgID(...) 或 QueryInterface(...)。此外,如果有人认为我的问题不是链接此库,而是其他问题,如果能指出我的问题可能出在哪里,那就太好了。

另外请记住,我需要以一种方式链接这些静态库,以便 R 编译器可以毫无问题地对其进行编译,如果我没记错的话,R 编译器只是一个 c 编译器。

最佳答案

我没有尝试使用 C/C++ 来执行此操作,而是使用 Fortran。我有一个类似的问题,因为一些标准 IO 库没有包含在我创建的库中。最后,我只是将它们全部包含在内并使用 Fortran 编译器进行了编译。我没有使用任何 R 编译器实用程序,只是像编译静态 Fortran 库一样编译,通常用于其他任何东西。这很好用。

调试路径可能是使用 gcc(或任何您正在使用的)编译为静态库,然后尝试从另一个 C 程序中包含并调用该静态库,然后如果可行,请尝试使用 R。

希望这对您有所帮助,据我所知,编写这些 R 程序包非常困难,除非您使用普通 C 或 Fortran。

关于gcc - 构建 R 包时如何链接静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937346/

相关文章:

c++ - 构造函数初始化列表评估顺序

c - 如何将程序链接到具有相同函数名称但不同实现的两个库?

c++ - 您选择的 cpu 不支持 x86-64 指令集

parsing - 有没有语义接近英语的编程语言?

r - 从列到行对的棘手分组

c - Ubuntu 11.10 上的 OpenCV && S2i Harpia

支持多个编译器的 C++ 代码

php - 如何在脚本中验证 CSS?

r - 什么 'Can' t 在顶层使用 `!!!`。是什么意思以及如何解决?

linux - 如何从 Linux 命令行离线安装具有依赖项的 R 库?