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

问题描述 投票:0回答:1

我正在创建一个将由 R (统计程序)使用的包,我不是使用此应用程序的专家,但我已经成功创建了一个非常简单的包,使用以下逻辑,我有一些类在 C++ 中,由于代码必须使用 R 编译器进行编译,并且它只允许 C 代码,所以我有一个调用 C++ 方法的包装器 C 代码,后来我有一个调用 C 代码公开的方法的 R 脚本,所以基本上是像 R <-> C<->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 编译器毫无问题地编译这些静态库的方式链接,如果我没记错的话,R 编译器只是一个 c 编译器。

r gcc static-libraries
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.