我正在创建一个将由 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 编译器。