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

Posted

技术标签:

【中文标题】构建 R 包时如何链接静态库【英文标题】:How to link with static libraries when building an R package 【发布时间】:2010-10-30 13:21:12 【问题描述】:

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

我用来创建这个包的完整教程在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】:

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

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

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

【讨论】:

以上是关于构建 R 包时如何链接静态库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用现有的静态库构建可可触控框架

如何将 TensorFlow Lite 构建为静态库并从单独的(CMake)项目链接到它?

当 iOS 应用程序链接到静态库时,如何获取丢弃的符号列表?

如何使用 ExternalProject_Add 静态链接到 NATS C 库

如何在链接到静态库的 DEV-CPP 中构建控制台应用程序时解决对 _imp__** 的未定义引用?

将谷歌protobuf lib静态链接到dll库