小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Ruby使用C/C 擴(kuò)展(包括windows和linux) | Only For Sun...

 左目右于 2012-03-28

Ruby使用C/C++擴(kuò)展,可以讓ruby變得很強(qiáng)大。
本文根據(jù)http://raylinn./blog/629329學(xué)習(xí)而來。
先說說流程,ruby C/C++擴(kuò)展,先由mkmf生成Makefile,之后再用make(linux),nmake(windows vc++)生成動(dòng)態(tài)鏈接庫。
放到ruby對(duì)應(yīng)目錄后,直接require即可。
步驟:
1.編寫C++文件(建議C/C++都用.cpp吧)
HelloTest.cpp

#include<stdio.h>   
#include<ruby.h>   
 
class TestClass  
{  
public:  
    TestClass(void){};  
    ~TestClass(void){};  
 
    void SayHello(char* msg)  
    {  
               printf("Ruby C/C++ extention Example cdlz.\n");  
               printf("Your Name is: %s\n",msg);  
    }  
};  
 
//VALUE self這個(gè)是不變的。指向自己。 第二個(gè): VALUE name則是我們這個(gè)函數(shù)需要的參數(shù)。   
VALUE method_sayhello(VALUE self,VALUE name){  
    long length=0;  
    char* yourname = rb_str2cstr(name, &amp;length);  //rb_str2cstr,轉(zhuǎn)換到C語言的字符串
    TestClass* test=new TestClass();  
    test-&gt;SayHello(yourname);  
    delete test;  
	return rb_str_new2(yourname); //rb_str_new2,由C語言的字符串轉(zhuǎn)換為Ruby的String。
};  
 
VALUE method_cfunction(VALUE self, VALUE va, VALUE vb)
{
	int a = NUM2INT(va);
	int b = NUM2INT(vb);
 
	return INT2NUM(a+b);
}
 
VALUE hellotest = Qnil; //Qnil 即為 NULL 
/*
如果全部都是C的,則需要加上extern "C" void Init_HelloTest()
*/
void Init_HelloTest(){  
  hellotest = rb_define_module("HelloTest");  
  //定義一個(gè)ruby方法,在ruby中調(diào)用。最后一個(gè)參數(shù)為 ruby方法的參數(shù)個(gè)數(shù) 
  rb_define_method(hellotest, "sayhello", RUBY_METHOD_FUNC(method_sayhello), 1);  
  rb_define_method(hellotest, "cfunction_plus", RUBY_METHOD_FUNC(method_cfunction), 2);   
};

上述代碼,實(shí)現(xiàn)了兩個(gè)ruby方法:sayhello和cfunction_plus
像返回值,參數(shù)值必須要注意類型,C和ruby之間的轉(zhuǎn)換,可以參見Programming Ruby一書第280頁。同時(shí)也有說到其他的方法。

2. extconf.rb

require 'mkmf'  
 
extension_name = "HelloTest" 
dirbase="D:/ruby/vc"
ruby_lib_base= dirbase+"/lib"
ruby_include_base= dirbase+"/include"
 
dir_config(extension_name)  
#如果是windows則取消下面注釋,注意,目錄名稱不能有空格
#dir_config(extension_name,ruby_include_base,ruby_lib_base)
 
create_makefile(extension_name)

之后運(yùn)行 ruby extconf.rb,以便生成Makefile文件。

linux下,一般直接運(yùn)行make即可生成so,然后make install 即可。
windows下,必須裝有visual studio,然后使用nmake即可。
visual studio要注意版本問題,直接去掉ruby的頭文件判斷吧:
ruby安裝目錄下: D:\ruby\ruby186\lib\ruby\1.8\i386-mswin32
config.h第二行注釋掉即可:
#if _MSC_VER != 1200
//#error MSC version unmatch
#endif
然后使用nmake編譯。
關(guān)于VC++ 7.0以上版本有一些特殊情況,就是manifest文件,這是發(fā)布一個(gè).exe的可執(zhí)行文件或者一個(gè).dll的動(dòng)態(tài)庫所需要的,默認(rèn)情況下,.manifest文件需要內(nèi)嵌到你的類庫中去??墒褂孟率雠幚砟_本:

ruby extconf.rb  
nmake  clean
nmake  
mt -manifest %1.so.manifest -outputresource:%1.so;2  
nmake install

如果沒有錯(cuò)誤,編譯通過,windows下可以使用如下命令查看dll導(dǎo)出函數(shù)情況:
dumpbin -exports HelloTest.so
。。。
1 0 00001120 Init_HelloTest = ?Init_HelloTest@@YAXXZ (void __cdecl Init_HelloTest(void))
。。。
linux下: nm -g HelloTest.so
最后附上ruby測(cè)試腳本:

require "HelloTest"
 
include HelloTest  
 
puts HelloTest.sayhello("aaa")
puts HelloTest.cfunction_plus(111,222)
 
puts HelloTest.methods - Object.methods

注意:如果是在擴(kuò)展中有輸出,則只有在ruby的輸出全部打印完畢后,才會(huì)有擴(kuò)展中的輸出(直接使用ruby test.rb,順序有正常。。。暫時(shí)無解。。。)。
本例的打印結(jié)果:

aaa
333
Ruby C/C++ extention Example cdlz.
Your Name is: aaa

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多