C++编写Ruby程序扩展的教程

来源:爱站网时间:2020-06-02编辑:网友分享
在Ruby中最酷的功能就是用C/C++ 定义的应用程序编程接口 (API) 扩展它,但是你知道C++要怎么编写Ruby程序扩展吗?接下来我们就和爱站小编一起去看看C++编写Ruby程序扩展的教程。

在Ruby中最酷的功能就是用C/C++ 定义的应用程序编程接口 (API) 扩展它,但是你知道C++要怎么编写Ruby程序扩展吗?接下来我们就和爱站小编一起去看看C++编写Ruby程序扩展的教程。

Ruby 提供了 C 头文件 ruby.h,它随附提供了许多功能,可使用这些功能创建 Ruby 类、模块和更多内容。除了头文件,Ruby 还提供了其他几个高层抽象来扩展基于本地 ruby.h 构建的 Ruby,本文要介绍的是 Ruby Interface for C++ Extensions 或 Rice。
创建 Ruby 扩展

在进行任何 Ruby 的 C API 或 Rice 扩展前,我想明确地介绍一下创建扩展的标准过程:

  •     您具有一个或多个 C/C++ 源代码,可使用它们构建共享库。
  •     如果您使用 Rice 创建扩展,则需要将代码链接到 libruby.a 和 librice.a。
  •     将共享库复制到同一文件夹,并将该文件夹作为 RUBYLIB 环境变量的一部分。
  •     在 Interactive Ruby (irb) prompt/ruby 脚本中使用常见的基于 require 的加载。如果共享库名为 rubytest.so,只需键入 require 'rubytest' 即可加载共享库。

假设头文件 ruby.h 位于 /usr/lib/ruby/1.8/include 中,Rice 头文件位于 /usr/local/include/rice/include 中,并且扩展代码位于文件 rubytest.cpp 中。 清单 1 显示了如何编译和加载代码。
清单 1. 编译和加载 Ruby 扩展

bash# g++ -c rubytest.cpp –g –Wall -I/usr/lib/ruby/1.8/include \
  -I/usr/local/include/rice/include
bash# g++ -shared –o rubytest.so rubytest.o -L/usr/lib/ruby/1.8/lib \
  -L/usr/local/lib/rice/lib -lruby –lrice –ldl -lpthread
bash# cp rubytest.so /opt/test
bash# export RUBYLIB=$RUBYLIB:/opt/test
bash# irb
irb> require 'rubytest'
=> true

Hello World 程序

现在,您已经准备好使用 Rice 创建自己的首个 Hello World 程序。您使用名为 Test 的 Rice API 和名为 hello 的方法创建了一个类,用它来显示字符串 "Hello, World!"。当 Ruby 解释器加载扩展时,会调用函数 Init_。对于 清单 1 的 rubytest 扩展,此调用意味着 rubytest.cpp 已定义了函数 Init_rubytest。Rice 支持您使用 API define_class 创建自己的类。清单 2 显示了相关代码。
清单 2. 使用 Rice API 创建类

#include "rice/Class.hpp"
extern "C"
void Init_rubytest( ) { 
 Class tmp_ = define_class("Test");
}

当您在 irb 中编译和加载清单 2 的代码时,应得到 清单 3 所示的输出。
清单 3. 测试使用 Rice 创建的类

irb> require ‘rubytest'
=> true
irb> a = Test.new
=> #<0x1084a3928>…


<0x0145e42112>


<:string>

<0x100494688><:string std::allocator>

<0x100494688>


<:string>

<:string>


<:string>

<:string><:string>

<:string>
<:string>

<:string><:string><:string>

<:string>


<0x10e71c5c8>


<:string><:string>


&init

<0x1010fe400>


&init&getvalue

“”

&cppType::print


&cppType::print


&cppType::print

<0x10d52cf48>


&cppType::print

<:test:0x1058efbd8>


上一篇:Ruby各种排序算法的实现方法

下一篇:Ruby如何实现合并排序算法

您可能感兴趣的文章

相关阅读

查看更多 >