我创建要由R(统计程序)中使用的包,我不使用该应用程序的专家,但我已成功地创建一个非常简单的包,使用下面的逻辑,我在C ++中某些类,作为代码必须使用R编译器编译并只允许C代码,我有调用C ++方法的包装的C代码,后来我具有R脚本调用由下暴露的方法代码,所以基本上是如R的通信< - > C < - >。C ++

这我用来创建此包中的全教程发现这里,我添加它作为参考。

现在我的问题是,我需要一些功能添加到我已经创建的包,我需要做的就是添加代码为后期绑定到一个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编译器的方式与静态库链接,他们可以编译没有问题。

有帮助吗?

解决方案

我还没有尝试用C / C ++,而是按照Fortran这样做。我在那些没有被列入我创建图书馆借了一些标准的IO库类似的问题。最后我只是包括他们所有和使用Fortran编译器编译。好像我是用别的使用正常编译一个静态的Fortran库我没有使用任何的R-编译器公用事业,刚编译。这个工作得很好。

一个调试路径可能是使用gcc(或你使用什么)然后尝试,包括与从另一个调用C程序静态库编译为静态库,然后如果工作有R尝试。

希望这是有帮助的,写这些的R程序包是相当困难的,除非你使用香草C或Fortran语言,据我可以告诉。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top