现在的位置: 首页 > 综合 > 正文

利用SWIG将C/C++库包装成Ruby模块

2018年01月10日 ⁄ 综合 ⁄ 共 889字 ⁄ 字号 评论关闭
利用SWIG将C/C++库包装成Ruby模块
2010-03-04 23:59

写了很多C/C++库,又想在Ruby中使用它们?不必用Ruby重写代码,SWIG(下载)可以帮你做到。 请参考以下示例。

(一)准备C++源文件 
/* 头文件: example.h */ 
extern double My_var; 
int factorial(int n); 

/* 源代码: example.cpp */ 
double My_var = 3.0;

int factorial(int n) 

    return n>1 ? factorial(n-1) : 1;
}

(二)编写SWIG的interface文件
/* File example.i */ 
/* 将来Ruby中采用的Module名称 */
%module example 
%{ 
#include "example.h" 
%}

/* 也可以在这里把变量、函数的声明直接列出来,但包含头文件显然更简洁、方便 */
%include "example.h"

(三)使用SWIG产生wrap文件。注:C++源代码需使用-c++参数
swig -c++ -ruby example.i # => example_wrap.cxx

(四)编译动态链接库。注:g++需使用-fPIC参数以生成Position Independent Code(PIC,位置无关代码),用于生成动态链接库(.so) ,在编译wrap文件时还应通过-I参数加上ruby.h所在位置(具体视安装位置不同而不同)。
g++ -c example.c # => example.o 
g++ -fPIC -c example_wrap.cxx -I/usr/local/lib/ruby/1.8.7/x86-64 # => example_wrap.o 
g++ -shared example.o example_wrap.o -o example.so

(五)使用
irb(main):001:0> require 'example'
=> true 
irb(main):002:0> Example.My_var
=> 3.0 
irb(main):003:0> Example.factorial(5)
=> 120

抱歉!评论已关闭.