M
Matt
I can not for the life of me get even the simplest C extension example
to load into ruby on Windows XP. The first case I tried actually was
the example provided by SWIG (the simple example). It fails with the
message
runme.rb:3:in `require': 127: The specified procedure could not be
found. - In
it_Example (LoadError)
/Example.dll
from runme.rb:3
The example was compiled with the provided MS-VC++ 6 project without
error. A dumpbin of example.dll reveals that the symbol Init_Example is
in fact exported. The same error is reported in both ruby 1.6.8 and
ruby 1.8.2. This is supposed to work in theory since it's
'automatically' generated by SWIG
I then tried to generate my own example based on some tutorials.
//--------------------simple.c------------------------------------------------
#include "ruby.h"
static VALUE simple_initialize(VALUE self, int iValue)
{
rb_iv_set(self,"@i",iValue);
rb_iv_set(self,"@a",rb_ary_new());
return self;
}
static VALUE simple_get_i(VALUE self)
{
return rb_iv_get(self,"@i");
}
static VALUE simple_set_i(VALUE self, int iValue)
{
return rb_iv_set(self,"@i",iValue);
}
static VALUE simple_get_a(VALUE self)
{
return rb_iv_get(self,"@a");
}
VALUE csimple;
void Init_simple()
{
csimple = rb_define_class("simple",rb_cObject);
rb_define_method(csimple,"initialize",simple_initialize,1);
rb_define_method(csimple,"i", simple_get_i, 0);
rb_define_method(csimple,"i=", simple_set_i, 1);
rb_define_method(csimple,"a", simple_get_a, 0);
}
//---------------------------------------------------------------------
#----- simple.rb ------------
require "simple"
s = simple.new(123)
p s.i
p s.a
s.i = 456
s.a.push("Hello")
s.a.push("World")
p s.a
#-----------------------------
The compile procedure from MS-VC++ 6
cl /LD /I$(RUBY_INCLUDE) /O2 simple.c $(RUBY_LIBPATH)\$(RUBY_LIB) /link
/def:simple.def
which compiles without error or warning. dumpbin reveals that
Dump of file simple.dll
File Type: DLL
Section contains the following exports for simple.dll
0 characteristics
43FE269D time date stamp Thu Feb 23 16:18:21 2006
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00001000 Init_simple
Summary
4000 .data
1000 .rdata
1000 .reloc
5000 .text
However running
D:\ruby>ruby simple.rb
/simple.rb:4: undefined local variable or method `simple' for
#<Object:0x5b6961
8> (NameError)
from simple.rb:2:in `require'
from simple.rb:2
This is the result from running ruby 1.6.8
I might go back and try 1.8.2 again later, but for now I'll use python.
At least SWIG seems to work with it on windows.
to load into ruby on Windows XP. The first case I tried actually was
the example provided by SWIG (the simple example). It fails with the
message
runme.rb:3:in `require': 127: The specified procedure could not be
found. - In
it_Example (LoadError)
/Example.dll
from runme.rb:3
The example was compiled with the provided MS-VC++ 6 project without
error. A dumpbin of example.dll reveals that the symbol Init_Example is
in fact exported. The same error is reported in both ruby 1.6.8 and
ruby 1.8.2. This is supposed to work in theory since it's
'automatically' generated by SWIG
I then tried to generate my own example based on some tutorials.
//--------------------simple.c------------------------------------------------
#include "ruby.h"
static VALUE simple_initialize(VALUE self, int iValue)
{
rb_iv_set(self,"@i",iValue);
rb_iv_set(self,"@a",rb_ary_new());
return self;
}
static VALUE simple_get_i(VALUE self)
{
return rb_iv_get(self,"@i");
}
static VALUE simple_set_i(VALUE self, int iValue)
{
return rb_iv_set(self,"@i",iValue);
}
static VALUE simple_get_a(VALUE self)
{
return rb_iv_get(self,"@a");
}
VALUE csimple;
void Init_simple()
{
csimple = rb_define_class("simple",rb_cObject);
rb_define_method(csimple,"initialize",simple_initialize,1);
rb_define_method(csimple,"i", simple_get_i, 0);
rb_define_method(csimple,"i=", simple_set_i, 1);
rb_define_method(csimple,"a", simple_get_a, 0);
}
//---------------------------------------------------------------------
#----- simple.rb ------------
require "simple"
s = simple.new(123)
p s.i
p s.a
s.i = 456
s.a.push("Hello")
s.a.push("World")
p s.a
#-----------------------------
The compile procedure from MS-VC++ 6
cl /LD /I$(RUBY_INCLUDE) /O2 simple.c $(RUBY_LIBPATH)\$(RUBY_LIB) /link
/def:simple.def
which compiles without error or warning. dumpbin reveals that
Dump of file simple.dll
File Type: DLL
Section contains the following exports for simple.dll
0 characteristics
43FE269D time date stamp Thu Feb 23 16:18:21 2006
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 00001000 Init_simple
Summary
4000 .data
1000 .rdata
1000 .reloc
5000 .text
However running
D:\ruby>ruby simple.rb
/simple.rb:4: undefined local variable or method `simple' for
#<Object:0x5b6961
8> (NameError)
from simple.rb:2:in `require'
from simple.rb:2
This is the result from running ruby 1.6.8
I might go back and try 1.8.2 again later, but for now I'll use python.
At least SWIG seems to work with it on windows.