你的第一个扩展
C 扩展由两个通用部分组成:
- C 代码本身。
- 扩展配置文件。
要开始使用你的第一个扩展,请将以下内容放在名为 extconf.rb
的文件中:
require 'mkmf'
create_makefile('hello_c')
有几点需要指出:
首先,名称 hello_c
是你编译的扩展名的输出。这将是你与 require
一起使用的。
其次,extconf.rb
文件实际上可以命名为任何东西,它传统上用于构建具有本机代码的宝石,实际编译扩展名的文件是运行 ruby extconf.rb
时生成的 Makefile。生成的默认 Makefile 编译当前目录中的所有 .c
文件。
将以下内容放在名为 hello.c
的文件中并运行 ruby extconf.rb && make
#include <stdio.h>
#include "ruby.h"
VALUE world(VALUE self) {
printf("Hello World!\n");
return Qnil;
}
// The initialization method for this module
void Init_hello_c() {
VALUE HelloC = rb_define_module("HelloC");
rb_define_singleton_method(HelloC, "world", world, 0);
}
代码细分:
名称 Init_hello_c
必须与 extconf.rb
文件中定义的名称匹配,否则在动态加载扩展名时,Ruby 将无法找到引导你的扩展名的符号。
对 rb_define_module
的调用是创建一个名为 HelloC
的 Ruby 模块,我们将命名为我们的 C 函数。
最后,对 rb_define_singleton_method
的调用使得模块级方法直接绑定到 HelloC
模块,我们可以使用 HelloC.world
从 ruby 调用。
通过调用 make
编译扩展后,我们可以在 C 扩展中运行代码。
启动控制台!
irb(main):001:0> require './hello_c'
=> true
irb(main):002:0> HelloC.world
Hello World!
=> nil