写了很多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