用C++写ruby扩展

转载 2012年03月22日 23:18:45

用C++写ruby扩展

为了测试CDMA短信的发送方便,于是想到编译成lib,提供ruby使用。

SmsObject.h:
void SendSms(const char* msg, const char* number, char* out);

main.cpp:

//
// by deli 2009.6.11
//
#include <ruby.h>
#include "SmsObject.h"

static VALUE makepdu(VALUE self, VALUE arg1, VALUE arg2) {
    VALUE s;
    char pdu[512] = {0};
    char* msg = RSTRING(arg1)->ptr;
    char* number = RSTRING(arg2)->ptr;

    SendSms(msg, number, pdu);
    s = rb_str_new2(pdu);

    return s;
}

extern "C"
void __declspec(dllexport) Init_sms() {
    VALUE myModule = rb_define_module("CDMA");

    VALUE myClass =
        rb_define_class_under(myModule, "SMS", rb_cObject);

    int arg_count = 2;
    rb_define_method(myClass, "makepdu", RUBY_METHOD_FUNC(makepdu), arg_count);
}

注意: C++要加上RUBY_METHOD_FUNC, C不用加。不然就会出现类似的错误:
error C2664: ‘rb_define_method’ : cannot convert parameter 3 from
‘unsigned long (unsigned long,unsigned long,unsigned long)’ to ‘unsigned long (_
_cdecl *)(…)’
None of the functions with this name in scope match the target type

test.rb:

#!/usr/bin/ruby 

require 'sms'

include CDMA

obj = SMS.new
pdu = obj.makepdu('什么都可以想,什么都可以不想,便觉得是个自由的人', '15338896034')

puts pdu

D:\Ruby\ruby-serial\sms>ruby test.rb
0000021002040702c54ce225a8d008420003200000013220c27602724487ea9f7a772b079ff86276
02724487ea9f7a772a706b079ff8627dfc4e4afcbb317a71540f53a98bb42275d00501a70801c00d
0101

大概就是这样。



早年写过用C++ + SWIG写Ruby插件的文,但实际中还是以原生C++写Ruby扩展,因为也相当简单。但长久没用还是会忘记,不得不翻以前的老代码回忆,写下这篇博文,若下次再忘记,也不至于去翻仓库。

建立 extconf.rb

require 'mkmf'

$libs = '-lstdc++'
create_makefile 'foo'
建立 foo.cc
#include <ruby.h>

VALUE plus(VALUE self, VALUE va, VALUE vb)
{
	int a = NUM2INT(va);
	int b = NUM2INT(vb);

	return INT2NUM(a+b);
}

extern "C" void Init_foo()
{
	VALUE foo = rb_define_module("Foo");
	rb_define_module_function(foo, "plus", RUBY_METHOD_FUNC(plus), 2);
}
生成扩展 foo.so
$ ruby extconf.rb
$ make
# 如果要安装至site-ruby
$ make site-install
测试文件 test.rb
require 'foo.so'

puts Foo.plus(3,4)
$ ruby test.rb
7

编写ruby扩展库

# Loads mkmf which is used to make makefiles for Ruby extensions require 'mkmf' # Give it a n...
  • frodo_sens
  • frodo_sens
  • 2014年07月23日 18:07
  • 1037

c++ 写 php 扩展

http://blog.sina.com.cn/s/blog_532f78a40100qqnr.html 此篇文章准备分2个部分来讲述:    第一部分主要详细讲述一下怎么构建一个完成的C...
  • loongwong2011
  • loongwong2011
  • 2016年09月14日 09:06
  • 653

用Ruby写第一个程序

初学Ruby,写HelloWorld的几种方法。
  • Jerry_1126
  • Jerry_1126
  • 2014年03月09日 11:12
  • 2117

Python 扩展使用 C/C++ 给 Python 写扩展模块的方法

本文来自作者 gashero 在 GitChat 上分享「Python 的 C 扩展开发惯例」,「阅读原文」查看交流实录 「文末高能」 编辑 | 嘉仔 目录 1   简介    ...
  • GitChat
  • GitChat
  • 2017年11月15日 00:00
  • 1369

【Ruby】模块扩展方法介绍

当我们要扩展类的方法时,我们可以采取Mixin的方式将模块中的方法添加到类中,下面会对实现的几种方式进行详细介绍。...
  • sunset108
  • sunset108
  • 2015年10月18日 13:48
  • 1130

C++下扩展卡尔曼类(EKF)的实现

最初的卡尔曼滤波用于解决离散系统的滤波问题,然而工程中常遇到的滤波问题是连续系统产生的滤波问题。 卡尔曼滤波器具有如下形式的离散的状态方程: Xk+1=Ψk+1,kXk+Wk(1)X_{k+1}=...
  • qiguizhe
  • qiguizhe
  • 2018年01月05日 11:59
  • 80

用C++写php扩展

以下将一个geniatagger的C++代码生成一个.so文件做成一个php扩展。 1.      应用场景 目前有一个用C++写成的词性标注器,以下通过写一个php扩展模块来使得在php中可以用...
  • wuwuwuwuwuwuwuwu
  • wuwuwuwuwuwuwuwu
  • 2012年12月20日 16:28
  • 809

eclipse搭建ruby开发环境,安装插件RDT,dltk,gems

因为Metasploit模块是用ruby写的,看不懂,本着急切的钻研精神学习一下. 由于自己做java出身,用惯了eclipse,在接触ruby的时候需要快速上手,就选择了java的开发环境搭建rub...
  • redbull_250ml
  • redbull_250ml
  • 2015年08月01日 04:04
  • 2062

apache 模块编写(c++)

注: 路径为:/home/xxx/ 工具为:apxs 框架搭建:   1、准备工作:安装apache对应的httpd-devel,主要是为了安装apxs。   ...
  • educast
  • educast
  • 2013年10月28日 14:56
  • 1093

用ruby写的一个网络爬虫程序

require 'open-uri'require 'thread'# run it like this :# ruby Crawl.rb 2 1000 http://www-cs.stanford....
  • wo970211002
  • wo970211002
  • 2015年06月09日 11:10
  • 313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C++写ruby扩展
举报原因:
原因补充:

(最多只允许输入30个字)