你的第一個擴充套件

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