On Feb 25, 1:08=A0pm, Ken Bloom <kbl... / gmail.com> wrote:
> Daniel Berger <djber... / gmail.com> wrote:
> > Hi,
>
> > I'm having some trouble pre-declaring some VALUE's. I've got a VALUE
> > cFoo I want to be visible to multiple source files. Say the layout is
> > something like this:
>
> > foo/ext/stuff/extconf.rb
> > foo/ext/stuff/foo.c
> > foo/ext/stuff/bar.c
> > foo/ext/stuff/baz.h
> > foo/ext/stuff/stuff.c
>
> > I want to define all the class VALUE's in the header file. I would
> > then like to be able to '#include "baz.h"' inside both foo.c and
> > bar.c. However, that causes an ld error when I try to build the source
> > files:
>
> > ld: duplicate symbol _cFoo in foo.o and bar.o
>
> > # extconf.rb
> > require 'mkmf'
> > create_makefile('stuff')
>
> > # Rakefile
> > require 'rake'
> > require 'rake/extensiontask'
> > Rake::ExtensionTask.new('stuff')
>
> > // baz.h
> > #ifndef BAZ_H_INCLUDED
> > #define BAZ_H_INCLUDED
> > #include <ruby.h>
> > VALUE cFoo;
> > VALUE cBar;
> > #endif
>
> This is a pretty standard C technique:
>
> in baz.h:
>
> #ifndef BAZ_H_INCLUDED
> #define BAZ_H_INCLUDED
> #include <ruby.h>
> //these lines just say that these variables exist
> extern VALUE cFoo;
> extern VALUE cBar;
> #endif
>
> in *one* of your .c files (presumably baz.c)
>
> //these lines declare memory for these variables
> //and need to appear exactly once in your project
> VALUE cFoo;
> VALUE cBar;

Ken, Joel,

Thanks. I don't know why, but I had it in my head that I didn't have
to extern the values.

Regards,

Dan