什麼是Ruby?
Ruby,一種為簡單快捷面向對象程式設計(面向對象程式設計)而創的腳本語言,由日本人松本行弘(まつもとゆきひろ,英譯:Yukihiro Matsumoto,外号matz)開發,遵守GPL協定和Ruby License。Ruby的作者認為Ruby > (Smalltalk + Perl) / 2,表示Ruby是一個文法像Smalltalk一樣完全面向對象、腳本執行、又有Perl強大的文字處理功能的程式設計語言。
什麼是SWIG?
SWIG(Simplified Wrapper and Interface Generator)是個幫助使用C或者C++編寫的軟體能與其它各種進階程式設計語言進行嵌入聯接的開發工具。SWIG能應用于各種不同類型的語言包括常用腳本編譯語言例如Perl, PHP, Python, Tcl, Ruby and PHP。
簡單來說,主要用于導出C/C++程式庫給腳本語言使用的一個自動化工具.導出的工作是非常機械化,而且繁複的.
編譯環境設定
Ruby在Windows下:
頭檔案在$RUBY_HOME/lib/ruby/1.8/i386-mswin32;
lib在$RUBY_HOME/lib,為msvcrt-ruby18.lib;
dll在RUBY_HOME/bin,其實隻有一個dll,就是:msvcrt-ruby18.dll.
在這裡需要注意到的是,$RUBY_HOME/lib/ruby/1.8/i386-mswin32/config.h這個檔案對VC的版本做了限制:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#if _MSC_VER != 1200
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#error MSC version unmatch
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#endif
是以,如果VC不是這個版本的話,編譯是通不過的,對此問題,最簡單的辦法就是:将這三行代碼注釋掉,就可以了.
C++解釋器包裹代碼
頭檔案
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#ifndef __RubyInterpreter_H__
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#define __RubyInterpreter_H__
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#include <string>
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
typedef unsigned long VALUE;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
typedef std::string String;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
typedef VALUE(*staticValueMethod)(
);
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
typedef VALUE(*ProtectedMethod)(VALUE);
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
class RubyInterpreter
{
public:
RubyInterpreter();
virtual ~RubyInterpreter();
/// 初始化解釋器
void initializeInterpreter();
/// 終止解釋器
void finalizeInterpreter();
/// 設定
void setOutputFunction(staticValueMethod func);
/// 加入引用庫的搜尋路徑
void addSearchPath(const String& path);
/// 執行語句
bool execute(const String& command);
/// 執行檔案
bool executeFile(String rubyfile);
private:
/// 記錄錯誤日志
void logRubyErrors(const std::string& intro, int errorcode);
///
void loadProtected(ProtectedMethod func, VALUE args,
const std::string& msg, bool exitOnFail = false);
static VALUE loadDlls(VALUE);
};
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
源檔案
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#include "StdAfx.h"
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#include "RubyInterpreter.h"
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#include "FixRubyHeaders.h"
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
#include <ruby.h>
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
RubyInterpreter::RubyInterpreter()
}
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
RubyInterpreter::~RubyInterpreter()
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void RubyInterpreter::initializeInterpreter()
#if defined(NT)
static int dummyargc(0);
static char** vec;
NtInitialize(&dummyargc, &vec);
// 初始化Ruby
ruby_init();
// 使用UTF8編碼
execute( "$KCODE = 'u'" );
// addSearchPath();
// 初始化腳本加載路徑
ruby_init_loadpath();
// 設定安全級别
rb_set_safe_level(0);
//
ruby_script("ruby");
//loadProtected(&RubyInterpreter::loadDlls, 0, "Ruby error while loading dlls");
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void RubyInterpreter::finalizeInterpreter()
ruby_finalize();
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void RubyInterpreter::setOutputFunction(staticValueMethod func)
rb_defout = rb_str_new("", 0);
// 定義一個虛拟類的方法
rb_define_singleton_method(rb_defout, "write", func, 1);
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void RubyInterpreter::addSearchPath(const String& path)
ruby_incpush(path.c_str());
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
VALUE RubyInterpreter::loadDlls(VALUE val)
String lib;
return rb_require(lib.c_str());
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void RubyInterpreter::loadProtected(ProtectedMethod func,
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
VALUE val,
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
const std::string& msg,
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
bool exitOnFail)
int error = 0;
rb_protect(func, val, &error);
logRubyErrors("Ruby error while initializing", error);
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void RubyInterpreter::logRubyErrors(const std::string& intro, int errorcode)
if (errorcode != 0)
{
VALUE info = rb_inspect(ruby_errinfo);
rb_backtrace();
if (intro.length() > 0)
{
}
}
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
bool RubyInterpreter::execute(const String& command)
int status = -1;
rb_eval_string_protect(command.c_str(), &status);
logRubyErrors("", status);
if ( status )
rb_eval_string_protect("print $!", &status);
return false;
return true;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
bool RubyInterpreter::executeFile(String rubyfile)
bool error = execute("load '" + rubyfile + "'");
return error;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
SWIG的使用
步驟大緻為:
1. 編寫字尾為.i的腳本;
2. 使用swig生成導出代碼,假如腳本名為:sample.i,那麼生成的源碼檔案名規則就為:sample_wrap.cpp/.c.
3. 将生成的cpp加入動态連結庫,然後編譯.
最簡單的.i腳本為:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
%module Export4ScriptLib
%{
#include "Player.h"
%}
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
%include "stl.i"
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
%include "Player.h"
Edit:如果想要使用STL的導出類,那就需要添加%include "stl.i"
假如說,頭檔案裡面定義的所有的類,類所有的方法,你都要将之導出,那麼以上就足夠了.但是,假如你隻需要導出部分的類,部分的類的方法.那麼你就需要自己手動寫入到.i腳本裡面去了.
生成代碼的指令為:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
swig.exe -c++ -ruby Exports.i
這樣寫的前提是你已經吧swig的路徑加入到環境變量裡面去了,其中第一個參數表示的是導出的代碼為c++,第二個參數表示的目标腳本語言是誰,第三個參數是.i腳本的路徑名.我寫了一個批處理:invoke_swig.bat,做這件事情.不過更完美的做法是在VC項目裡面的"預生成事件"加入此語句.
剩下的事情就是把生成的代碼和要導出的代碼編譯一邊,就可以開始使用導出的C++庫了.
測試
在執行個體代碼裡面:Export4ScriptLib工程是動态連結庫工程,testRubyInterpreter是測試用的可執行程式工程.
測試用的Ruby代碼test.rb如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
require 'Export4ScriptLib'
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
print "hello 你好!\n"
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
ply = Export4ScriptLib::Player.new
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
ply.Jump();
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
ply.Move(100, 2000);
測試用C++代碼如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
class testClient
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
testClient()
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
mRubyInterpreter = new RubyInterpreter();
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
mRubyInterpreter->initializeInterpreter();
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
~testClient()
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
delete mRubyInterpreter;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
void exec()
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
// 執行語句
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
mRubyInterpreter->execute("print \"This is C++ call Ruby print funtion!\n\"");
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
// 執行檔案
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
mRubyInterpreter->executeFile("test.rb");
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)
RubyInterpreter* mRubyInterpreter;
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuUmbv50LcNncvRXYjlGZul0ZulmbpxGd190LcNXZnFWbJ9CXt92Yuc2bsJGcwNmL3d3dvw1LcpDc0RHaiojIsJye.gif)