3

我正在创建一个将由 R(统计程序)使用的包,我不是使用此应用程序的专家,但我设法使用以下逻辑创建了一个非常简单的包,我有一些类C++,因为代码必须使用 R 编译器编译并且它只允许 C 代码,所以我有一个调用 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 编译器。

4

1 回答 1

2

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

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

希望这会有所帮助,编写这些 R 包非常困难,除非据我所知您使用的是 vanilla C 或 Fortran。

于 2009-06-02T09:25:43.190 回答