把RubyVM嵌入C

这个想法来源于@penpen跟我说他在objective-C里面调用ruby的代码和gem包,然后我觉得也挺好玩的~就去试了一下

嵌入RubyVM

这一步比较简单

#include <ruby.h>

int main(int argc,char ** argv) {
	ruby_sysinit(&argc, &argv);
	RUBY_INIT_STACK;
	ruby_init();
	ruby_init_loadpath();
	ruby_script("embedded");
	rb_require("rubygems");
	rb_require("enc/encdb");
	rb_require("./scripts/start.rb");
	ruby_finalize();
	exit(0);
}

加载gem包

ruby_script(“embedded”) rb_require(“rubygems”);

这两句是确保ruby环境能够加载gem包

编译方法

MAKE=gcc
CFLAGS=-I/Users/megrez/.rbenv/versions/2.1.2/include/ruby-2.1.0 -I/Users/megrez/.rbenv/versions/2.1.2/include/ruby-2.1.0/x86_64-darwin14.0 -g
LDFLAGS=-L/Users/megrez/.rbenv/versions/2.1.2/lib -lruby -ldl -lobjc

main: main.o
	$(MAKE) -o main main.o $(LDFLAGS)

rbenv编译动态链接库

rbenv默认不会生成.so的动态链接库文件,只会生成.a的静态文件,所以需要重新编译ruby

参考这篇文章rbenv/ruby-build and shared libraries (libruby.so)

$ RUBY_CONFIGURE_OPTS="--enable-shared" benv install 2.1.2

一定要放在一行里面运行