Accessing extern variable in Ruby DLL

Denis Koroskin 2korden at gmail.com
Fri Jan 16 23:11:18 PST 2009


On Sat, 17 Jan 2009 06:30:35 +0300, Jordan Miner <TheUndaunted at nospam.gmail.com> wrote:

> Hello,
>
> I recently wrote a binding to Ruby’s extension API , and today finished  
> writing a simple extension using it. But I ran into something strange.  
> (I also had a problem compiling the DLL since I use Tango, but searching  
> the newsgroup yielded the solution.)
>
> Ruby’s API has rb_cObject, rb_cString, etc. as global variables that it  
> sets to the Object class, String class etc. In ruby.h, they are defined  
> as
>
> extern unsigned long rb_cObject;
>
> so in my binding I have
>
> extern uint rb_cObject;
>
> But when I try to use rb_cObject from my extension, it is not the right  
> value... I think rb_cObject should equal rb_eval_string("Object"), but  
> it does not. (Using the wrong value causes an access violation.)
>
> I produced an OMF import library for Ruby’s runtime DLL by using  
> coff2omf on the COFF import library that ships with it. I'm linking my  
> extension with this import library.
>
> If I remove the extern from my binding, I get a multiple definition  
> error, so I must be linking with the variable in the DLL? But it seems  
> the value is wrong. I’ve worked around this by calling  
> rb_eval_string("Object") instead, but I’m really curious what could be  
> happening here. Using rb_cObject is the usual way of referring to the  
> Object class in C extensions, and I want to make sure my binding is  
> correct. Could it be because the DLL was compiled with Visual Studio and  
> my extension is in D?
>
> Any ideas?
>

Try the following:

extern(C) extern uint rb_cObject;




More information about the Digitalmars-d mailing list