MST

星途 面试题库

面试题:Ruby与C扩展交互开发之基础调用

请简述在Ruby中如何调用一个简单的C函数,假设已有一个C函数 `int add(int a, int b)` 用于返回两个整数之和,写出Ruby调用该C函数的基本步骤和关键代码片段。
28.2万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
  1. 创建C扩展模块
    • 首先,创建一个C源文件(例如 add.c),内容如下:
#include "ruby.h"

static VALUE add(VALUE self, VALUE a, VALUE b) {
    int num_a = NUM2INT(a);
    int num_b = NUM2INT(b);
    int result = num_a + num_b;
    return INT2NUM(result);
}

void Init_add() {
    VALUE m = rb_define_module("AddModule");
    rb_define_module_function(m, "add", add, 2);
}
  1. 编写 extconf.rb 文件
    • 在同一目录下创建 extconf.rb 文件,内容如下:
require 'mkmf'
create_makefile('add')
  1. 编译C扩展
    • 在终端中,进入包含 add.cextconf.rb 的目录,执行以下命令:
ruby extconf.rb
make
  1. 在Ruby中调用
    • 创建一个Ruby脚本(例如 main.rb),内容如下:
require_relative 'add'
result = AddModule.add(3, 5)
puts result

以上步骤中:

  • 在C代码部分,通过Ruby提供的API将C函数 add 封装成可以在Ruby中调用的形式,Init_add 函数用于初始化扩展模块。
  • extconf.rb 文件用于生成Makefile,make 命令依据Makefile编译C代码生成动态库。
  • Ruby脚本中,通过 require_relative 引入扩展模块,然后调用模块中的 add 方法并输出结果。