如何在构建R包时与静态库链接

时间:2009-06-01 23:52:20

标签: gcc compiler-construction r static-libraries

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

我找到了用于创建此包的完整教程here,我将其添加为参考。

现在我的问题是我需要为我已经创建的包添加一些功能,我需要做的是添加代码以便后期绑定到COM对象,这是我创建的另一个产品,并且使用regasm工具。

这是我用来尝试延迟绑定到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。

所以,我的问题是,我如何能够包含这些库,以便能够使用后期绑定的方法,如CLSIDFromProgID(...)或QueryInterface(...)。此外,如果有人认为我的问题不是链接这些库,而是其他东西,那么如果可以指出我的问题可能就会很好。

另外请记住,我需要链接这些静态库,以便R编译器可以毫无问题地编译它们,如果我没有错,那么它只是一个c编译器。

1 个答案:

答案 0 :(得分:2)

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

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

希望这是有帮助的,编写这些R包非常困难,除非你尽可能地使用vanilla C或Fortran。