Tim Hunter
8/2/2006 1:05:00 AM
Daniel Berger wrote:
> Timothy Hunter wrote:
>
>> Daniel Berger wrote:
>>
>>> Hi,
>>>
>>> How do you get at a static function from within a C extension? I tried
>>> this snippet where I attempt to use flo_plus from numeric.c:
>>>
>>> /* foo.c */
>>> #include <ruby.h>
>>>
>>> extern VALUE flo_plus(VALUE, VALUE);
>>>
>>> static VALUE foo_test(VALUE x, VALUE y){
>>> return flo_plus(x, y);
>>> }
>>>
>>> void Init_foo(){
>>> VALUE cFoo = rb_define_class("Foo", rb_cObject);
>>> rb_define_method(cFoo, "test", foo_test, 2);
>>> }
>>>
>>> # test.rb
>>> $:unshift Dir.pwd
>>> require 'foo'
>>> f = Foo.new
>>> f.test
>>>
>>> This result is:
>>>
>>> ruby: symbol lookup error:
>>> /home/djberge/programming/ruby/extensions/foo.so: undefined symbol:
>>> flo_plus
>>>
>>> I tried linking explicitly against -lruby but that didn't help.
>>>
>>> Regards,
>>>
>>> Dan
>>>
>>>
>>>
>>>
>> Where is 'flo_plus' defined?
>>
>
> In numeric.c. Note that it *builds* fine, it just doesn't *run*.
>
> Regards,
>
> Dan
>
>
>
I see. Since flo_plus has static linkage in numeric.c you can't call it
from your extension. It builds okay because you supplied a declaration
for it, and it links okay because Linux does lazy linking (that is,
external symbols aren't resolved until the .so gets loaded), but it
won't run because there's no external definition of flo_plus to match
your external reference.
You'll have to use rb_funcall to call "+".