通过 SWIG 从 Ruby 调用 Boost?

Posted

技术标签:

【中文标题】通过 SWIG 从 Ruby 调用 Boost?【英文标题】:Calling Boost from Ruby via SWIG? 【发布时间】:2010-11-15 05:24:44 【问题描述】:

假设我想从 Ruby 代码中调用一个或多个 boost 库函数。有很多我想这样做的例子,但最近我想使用 Boost Graph 库进行高效的图形处理。我认为最常建议这样做的方法是使用 SWIG。有没有人经历过并为 Boost 库生成 SWIG 包装器?这实际上是与 Boost 互操作的最佳方式吗? Boost 的哪些部分无法通过 SWIG 访问,因为它们需要不受支持的 C++ 功能才能工作?

【问题讨论】:

我也在考虑从 Ruby 访问 Boost Graph 库。你试过了吗?如果是这样,如果您能提供有关它的信息,将会有所帮助。 你在哪里得到了这个? 【参考方案1】:

我不能说我专门为 Boost 库生成了包装器,但我已经为自己的模板类生成了包装器。

只要您记住 SWIG 将使用 %template 指令包装特定的模板实例化,这是完全可行的。

如上面链接的文档中所述:

[...] 裸 C++ 模板没有定义任何类型的可运行对象代码,SWIG 通常可以为其创建包装器。因此,为了包装模板,您需要提供有关特定模板实例化的 SWIG 信息(例如,vector<int>array<double> 等)。其次,像vector<int> 这样的实例化名称在大多数目标语言中通常不是有效的标识符名称。因此,您需要在创建包装器时为模板实例化一个更合适的名称,例如 intvector

使用该指令,您的 intvector 将如下所示:

%template(intvector) vector<int>;

【讨论】:

以上是关于通过 SWIG 从 Ruby 调用 Boost?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 和 SWIG 与 CMake

Swig + Lua:调用 m(int argv, char **argc)

通过 SWIG 从 C++ 调用 Go 回调函数

使用 SWIG 跨 C++ 和 Ruby 的多态性

相当于存储 boost::python::object 的 SWIG

你能 SWIG 一个 boost::optional<> 吗?