乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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++)生成動態(tài)鏈接庫。
      放到ruby對應(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這個是不變的。指向自己。 第二個: VALUE name則是我們這個函數(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");  
        //定義一個ruby方法,在ruby中調(diào)用。最后一個參數(shù)為 ruby方法的參數(shù)個數(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)了兩個ruby方法:sayhello和cfunction_plus
      像返回值,參數(shù)值必須要注意類型,C和ruby之間的轉(zhuǎn)換,可以參見Programming Ruby一書第280頁。同時也有說到其他的方法。

      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ā)布一個.exe的可執(zhí)行文件或者一個.dll的動態(tài)庫所需要的,默認(rèn)情況下,.manifest文件需要內(nèi)嵌到你的類庫中去??墒褂孟率雠幚砟_本:

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

      如果沒有錯誤,編譯通過,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測試腳本:

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

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多