你的第一个扩展

C 扩展由两个通用部分组成:

  1. C 代码本身。
  2. 扩展配置文件。

要开始使用你的第一个扩展,请将以下内容放在名为 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