你的第一個擴充套件
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